django在模板

时间:2016-07-31 21:11:24

标签: python django

我想在模板的选择字段中使用这些值。假设我上课了:

MY_CHOICES = (
    ('A1', 'The best steak sauce'),
    ('B2', 'Very stealthy'),
    ('C3', 'Missing a P0'))

class MyClass(models.Model):
    my_field = models.CharField(max_length = 2, choices = MY_CHOICES)

我的表格是:

<form method="post">
    {% csrf_token %}
    <select>
    {% for m in models.MY_CHOICES %}
        <option>m</option>
    {% endfor %}
    </select>
</form>

我在这里返回一个空的选择(即一个没有选项)。

我看了this,但无法理解发生了什么。任何帮助将不胜感激,谢谢!

2 个答案:

答案 0 :(得分:1)

这个问题的最简单的解决方案是,您应该在models.py所在的同一目录中创建一个文件forms.py,并将此代码写入文件中:

<强> forms.py

from models import MyClass
from django import forms


class MyForm(forms.ModelForm):

   class Meta:
      model = MyClass

之后,将您的表单作为上下文传递到各自的视图中,如下所示:

<强> views.py

from forms import MyForm # import that created class in previous step
from django.core.context_processors import csrf

def my_view(request):
  context = {}
  context.update(csrf(request))
  context["form"] = MyForm()
  return render(request, "form.html", context)

并在最后使用模板标签来获得所需的输出,例如

<强> form.html

<form method="post">
    {% csrf_token %}
    <select>
     {{ form.as_p }}
    </select>
</form>

这可以帮助你。

答案 1 :(得分:-1)

编辑:添加了一个新的解决方案,因为第一个只是作者Woody1193忘记提及的一行,但已经实现了。

我实际上遇到了类似的问题,并通过在javascript中创建自定义POST函数来解决它。

https://docs.djangoproject.com/en/1.9/ref/csrf/#ajax复制,您可以使用以下代码片段获取Cookie:

// using jQuery
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie('csrftoken');

在阅读了有关隐藏输入表单的解决方案后,我被引导采用类似的方法来解决选择问题:JavaScript post request like a form submit

这是定制部分。我基本上使用了混合2已经存在的解决方案,这对我有用。 它实际上是上面链接中的第二个解决方案:

// Post to the provided URL with the specified parameters.
function post(path, parameters) {
    var form = $('<form></form>');

    form.attr("method", "post");
    form.attr("action", path);

    var csrf_field.setAttribute("name", 'csrfmiddlewaretoken');
    csrf_field.setAttribute("value", getCookie('csrftoken'));
    form.appendChild(csrf_field);

    $.each(parameters, function(key, value) {
        var field = $('<input></input>');

        field.attr("type", "hidden");
        field.attr("name", key);
        field.attr("value", value);

        form.append(field);
    });

    // The form needs to be a part of the document in
    // order for us to be able to submit it.
    $(document.body).append(form);
    form.submit();
}

<强> OLD:

我是通过在表单开头使用csrf_token来解决它的。

您的代码如下:

<form method="post">
  {% crsf_token %}
  <!-- all the good stuff -->
</form>

您可以在此处找到更好的说明,如何(希望)解决您的问题:https://docs.djangoproject.com/en/1.9/ref/csrf/