Django - ModelForm:添加不属于模型的字段

时间:2015-06-20 17:49:31

标签: python django django-forms django-crispy-forms

注意:为我的表单使用django-crispy-forms库。如果您的问题解决方案涉及不使用cripsy_forms库,我会同样接受它。不试图挑剔只是需要一个解决方案/解决。感谢

在我的表单Meta课程中,我在表单中设置了我想要的模型Driftwood及其字段,但我还想添加另一个字段。一个不属于引用模型的人。我要添加的这个字段是一个图像。这个领域的原因是从中构建另一个模型。

我有一个名为Image的模型,其中包含一些字段,这些字段通过使用单个models.ImageField()进行填充。此Image还有models.ForeginKey()Driftwood模型的关系。因此Image可以使用其关系集属性(Driftwood)通过driftwood.image_set的实例进行访问。

view.py我使用generic.CreateView()作为将处理我的表单类的继承类。我计划使用form_valid()方法通过form.cleaned_data获取我需要的图像。然后,我将创建图像,将新实例化的object.id的{​​{1}}和图像传递到我的Driftwood模型中。

我遇到的问题是不知道如何向不属于与表单关联的模型的Django Image添加自定义字段。

forms.py

FormModel

models.py

from django import forms

from crispy_forms.helper import FormHelper
from crispy_forms.layout import Layout, ButtonHolder, Submit

from . import models

class DriftwoodForm(forms.ModelForm):
    class Meta:
        model = models.Driftwood
        fields = ('user', 'title', 'description')

    def __init__(self, *args, **kwargs):
        super(DriftwoodForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper()
        self.helper.layout = Layout(
            'user',
            'Insert Image Field Here',
            'title',
            'description',
            ButtonHolder(
                Submit('save', 'Save', css_class='btn-success')
            )
        )

2 个答案:

答案 0 :(得分:3)

这就是你如何用非django-crispy-forms形式:

from django import forms

from . import models


class DriftwoodForm(forms.ModelForm):
    class Meta:
        model = models.Driftwood
        fields = ('user', 'title', 'description', 'image')

    image = forms.ImageField()

完整文档:https://docs.djangoproject.com/en/1.8/ref/forms/fields/#django.forms.ImageField

现在您要做的就是像往常一样使用表单,在表单上调用save(),不要试图将图像保存到Meta中指定的模型上课,但你可以用田地做任何你想做的事。

我不确定你,但我想你可以用django-crispy-forms做同样的事情,只需添加下面的字段并从模型中假设它。

答案 1 :(得分:2)

这里有更新的表格以防万一有人好奇。

class DriftwoodForm(forms.ModelForm):
    class Meta:
        model = models.Driftwood
        fields = ('user', 'title', 'description', 'image')

    image = forms.ImageField()

    def __init__(self, *args, **kwargs):
        super(DriftwoodForm, self).__init__(*args, **kwargs)

        self.helper = FormHelper()
        self.helper.layout = Layout(
            'user',
            'image',
            'title',
            'description',
            ButtonHolder(
                Submit('save', 'Save', css_class='btn-success')
            )
        )