【问题标题】:Django model CreateView does not render form fields in HTMLDjango 模型 CreateView 不在 HTML 中呈现表单字段
【发布时间】:2019-11-17 07:08:38
【问题描述】:

我正在尝试在我的 django 站点中为模型设置基于类的“CreateView”,但是当呈现创建 html 页面时,模型字段不会呈现。网页上只显示提交按钮。但是,在调试时,我重写了类视图中的“form_invalid”方法,并且表单对象具有存储在对象中的所有字段所需的 HTML。如果我获取此 HTML 并手动将其添加到浏览器中创建页面的 HTML 中,我可以填写字段并将数据发布到数据库。

目前我还没有找到关于为什么不呈现表单字段的明显答案,因此将不胜感激。

使用环境:python 3.7.3、django 2.2.3


解决方案:

此问题已通过更改视图上下文数据中的表单名称得到解决。

在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 模板中将 'alert_form' 更改为 'form' 以匹配默认上下文。


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:

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']

urls.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>

创建呈现的页面:

使用手动修改的 HTML 创建页面:

【问题讨论】:

    标签: python django django-forms django-views


    【解决方案1】:

    CreateView(FormMixin)设置的表单的上下文名称是“form”,您的模板引用了“alert_form”

    Here 是一个有用的网站,可以查看基于类的视图中的所有可用选项

    【讨论】:

    • 感谢分享该链接,这是非常有用的信息。一个后续问题:我认为表单定义是由创建视图中的 ``` form_class= AlertModelForm ``` 设置处理的。但我还应该在 get_context_data() 中设置表单的上下文名称?
    • @LucLapenta 不幸的是,FormMixin 没有提供在上下文中更改表单名称的好方法。您可以覆盖 get_context_data 方法并在上下文字典中更改表单的名称
    猜你喜欢
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 2017-05-04
    • 2011-12-30
    • 2019-02-23
    • 1970-01-01
    相关资源
    最近更新 更多