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

Cri*_*spy 5 python django django-forms django-crispy-forms

注意:将django-crispy-forms库用于我的表单。如果您有解决不使用cripsy_forms库的问题的解决方案,我将完全接受。不试图变得挑剔,只需要一个解决方案/解决。谢谢

在表单的Meta类中,我设置了模型,Driftwood它是我想要在表单中的字段,但是我也想添加另一个字段。不属于参考模型的模型。我要添加的字段是图像。此字段的原因是要从中构建另一个模型。

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

view.pygeneric.CreateView()用作将处理我的窗体类的继承的类。我计划使用该form_valid()方法来获取form.cleaned_data所需的图像。然后,我将创建图像,将object.id新实例化Driftwood的图像和图像传递到Image模型中。

但是,我的问题是不知道如何向FormModel不与表单关联的模型的Django添加自定义字段。

表格

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')
            )
        )
Run Code Online (Sandbox Code Playgroud)

models.py

from base64 import b64decode, b64encode # used to encode/decode image

from django.db import models

class TimeStampMixin(models.Model):
    class Meta:
        abstract = True

    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)


class Driftwood(TimeStampMixin):
    user = models.ForeignKey(User)
    title = models.CharField(max_length=255)
    description = models.TextField(max_length=1000)
    slug = models.SlugField(max_length=255)


class Image(TimeStampMixin):

    driftwood = models.ForeignKey(Driftwood)
    image = models.ImageField(upload_to='static/images')

    # gets encoded as a string in the save method
    encoded_image = models.TextField(blank=True, null=False, default='')
Run Code Online (Sandbox Code Playgroud)

Has*_*nPy 4

这是对非 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()
Run Code Online (Sandbox Code Playgroud)

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


现在您要做的就是像往常一样简单地使用表单,调用save()表单不会尝试将图像暴力保存到类中指定的模型中Meta,但您将能够对该字段执行任何您想要的操作。

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