【问题标题】:Django - ModelForm: Add a field not belonging to the modelDjango - ModelForm:添加不属于模型的字段
【发布时间】:2015-09-06 13:21:24
【问题描述】:

注意:在我的表单中使用 django-crispy-forms 库。如果您对我的问题有不使用cripsy_forms 库的解决方案,我同样接受。不想挑剔只需要一个解决方案/解决方法。谢谢

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

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

在view.py 中,我使用generic.CreateView() 作为继承类来处理我的表单类。我打算用form_valid()的方法通过form.cleaned_data获取我需要的图片。然后我将创建图像,将我新实例化的Driftwood 的object.id 和图像传递给我的Image 模型。

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

forms.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')
            )
        )

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='')

【问题讨论】:

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


    【解决方案1】:

    这就是你对非 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 做同样的事情,只需添加下面的字段并假设它来自模型本身。

    【讨论】:

    • 啊,太棒了。如此简单,我喜欢简单,它应该在哪里。谢谢您的帮助。我还没有过多地使用crispy_forms,但我会找到方法的。
    • 你绝对应该阅读这篇文章,它会让事情变得更容易。 docs.djangoproject.com/en/1.8/ref/forms
    • 好的 crispy_forms 太棒了,我只需要将布局中的 'Insert Image Field Here', 替换为 'image',,现在一切正常。
    • 感谢您的链接。我最近一直在阅读 django 文档。我怕我永远做不完。
    【解决方案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')
                )
            )
    

    【讨论】:

      猜你喜欢
      • 2011-06-07
      • 2013-05-14
      • 2015-08-31
      • 2012-11-13
      • 2011-05-19
      • 2011-01-05
      • 2012-01-26
      • 2023-03-09
      相关资源
      最近更新 更多