Python Django model CreateView不在HTML中呈现表单字段
我试图为django站点中的模型设置一个基于类的“CreateView”,但是当CreateHTML页面呈现时,模型字段不会呈现。网页上只显示提交按钮。但是,在调试时,我重写了类视图中的“form_invalid”方法,并且form对象具有存储在该对象中的所有字段所需的HTML。如果我使用这个HTML并手动将其添加到浏览器中创建页面的HTML中,我可以填写字段并将数据发布到数据库中 在这一点上,我还没有找到一个明显的答案来解释为什么表单字段没有呈现,所以对此的任何帮助都将不胜感激 使用的环境:python 3.7.3、django 2.2.3Python Django model CreateView不在HTML中呈现表单字段,python,django,django-forms,django-views,Python,Django,Django Forms,Django Views,我试图为django站点中的模型设置一个基于类的“CreateView”,但是当CreateHTML页面呈现时,模型字段不会呈现。网页上只显示提交按钮。但是,在调试时,我重写了类视图中的“form_invalid”方法,并且form对象具有存储在该对象中的所有字段所需的HTML。如果我使用这个HTML并手动将其添加到浏览器中创建页面的HTML中,我可以填写字段并将数据发布到数据库中 在这一点上,我还没有找到一个明显的答案来解释为什么表单字段没有呈现,所以对此的任何帮助都将不胜感激 使用的环境:p
解决方案: 通过更改视图上下文数据中的表单名称,解决了此问题 在views.py中:
def get_context_data(self, *args, **kwargs):
context = super(CreateAlertView, self).get_context_data(**kwargs)
context["alert_form"]=context["form"]
return context
或者。。。
在HTML模板中,将“警报表单”更改为“表单”,以匹配默认上下文
models.py:
class Alert(models.Model):
RAIN = 'Rain'
SNOW = 'Snow'
COLD = 'Cold'
HEAT = 'Heat'
WEATHER_CHOICES = [
(RAIN, 'Rain'),
(SNOW, 'Snow'),
(COLD, 'Cold'),
(HEAT, 'Heat'),
]
DAILY = 'Daily'
WEEKLY = 'Weekly'
INTERVAL_CHOICES = [
(DAILY, 'Daily'),
(WEEKLY, 'Weekly'),
]
weather_type = models.CharField(max_length=15, choices=WEATHER_CHOICES, default=RAIN)
interval = models.CharField(max_length=10, choices=INTERVAL_CHOICES, default=DAILY)
search_length = models.IntegerField(default=1)
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
active = models.BooleanField(default=False)
views.py:
def get_context_data(self, *args, **kwargs):
context = super(CreateAlertView, self).get_context_data(**kwargs)
context["alert_form"]=context["form"]
return context
class CreateAlertView(LoginRequiredMixin, CreateView):
template_name = 'users/alert_form.html'
#model = Alert
form_class = AlertModelForm
success_url = 'users/profile/'
def form_valid(self, form):
print('validation')
form.instance.user = self.request.user
return super().form_valid(form)
def form_invalid(self, form):
print(form) # check form HTML here
return super().form_invalid(form)
forms.py:
class AlertModelForm(ModelForm):
class Meta:
model = Alert
exclude = ['user']
URL.py:
urlpatterns = [
path('alert/create/', CreateAlertView.as_view(), name='alert'),
]
html模板:
<h1>create an alert</h1>
<form method="post">
{% csrf_token %}
{{ alert_form.as_p }}
{{ alert_form.non_field_errors }}
{{ field.errors }}
<button type="submit">Save changes</button>
</form>
创建警报
{%csrf_令牌%}
{{alert_form.as_p}
{{alert_form.non_field_errors}}
{{field.errors}}
保存更改
创建呈现的页面:
使用手动修改的HTML创建页面:
CreateView(FormMixin)设置的表单的上下文名称是“表单”,您的模板引用的是“警报表单”
是一个很有用的网站,可以查看基于类的视图中的所有可用选项感谢您共享该链接,这是非常有用的信息。一个后续问题:我认为表单定义是由create视图中的``form\u class=AlertModelForm``设置处理的。但是,我还应该在get_context_data()中设置表单的上下文名称?@LucLapenta不幸的是,
FormMixin
没有提供一种在上下文中更改表单名称的好方法。您可以重写get\u context\u data
方法,并在context dict中更改表单的名称