我想在模板的选择字段中使用这些值。假设我上课了:
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,但无法理解发生了什么。任何帮助将不胜感激,谢谢!
答案 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/