【问题标题】:Create model when processing form with class based view使用基于类的视图处理表单时创建模型
【发布时间】:2014-11-20 23:12:05
【问题描述】:

我正在尝试在 django 1.7 中学习基于类的视图。

我有两个模型,第二个模型有第一个的外键。

class A(models.Model):                    
    text = models.CharFeild(max_length=10)

class B(models.Model):
    a1 = models.ForeignKey(A)
    content = models.TextField()

class BCreateView(CreateView):
    model = B
    fields = ['a1', 'content']

和形式:

<form action="?" method="post">
    <table>
        {{ form.as_table }}
    </table>
    <input type="submit" value="create" /> 
</form>

当用户将数据输入表单而不是下拉列表中的值来自第一个模型时,我想使用文本输入,因此用户可以在处理 B 的表单之前为 A 创建输入文本和实例。我想不通如何使用基于类的视图和表单来做到这一点。

【问题讨论】:

  • 可能我必须重写 Form 类中的 is_valid 方法,但是如何更改小部件中的数据?

标签: python django django-forms django-views


【解决方案1】:

您将需要创建一个自定义表单,而不是依赖 django 通过 CreateView 为您提供的自动生成表单。

class MyForm(ModelForm):

  class Meta:
    model = B
    fields = ('a1', 'content)
    widgets = {
        'a1': TextInput(),
    }

然后在你的视图中:

class BCreateView(CreateView):

    model = B
    form_class = MyForm

在此处查看更多详细信息:https://docs.djangoproject.com/en/dev/topics/forms/modelforms/#overriding-the-default-fields

【讨论】:

  • 即使我创建了这样的表单,我仍然需要自定义验证方法,因为应该在保存 B 之前创建 A。这里 a1 只需要 pk,但我只需要传递文本。
【解决方案2】:

所以最终我从 FormView 继承了 BCreateView 并将表单类定义为 forms.Form 的后代并在 post 方法中手动检查表单。

【讨论】:

    猜你喜欢
    • 2022-01-10
    • 2011-08-02
    • 2017-11-07
    • 2016-12-05
    • 1970-01-01
    • 2012-02-12
    • 2014-11-21
    • 1970-01-01
    • 2013-08-08
    相关资源
    最近更新 更多