python – Django – ModelForm:添加一个不属于该模型的字段
作者:互联网
注意:为我的表单使用django-crispy-forms库.如果您的问题解决方案涉及不使用cripsy_forms库,我会接受它.不试图挑剔只是需要一个解决方案/解决.谢谢
在我的表单的Meta类中,我设置了模型,Driftwood,以及它在表单中我想要的字段,但我还想添加另一个字段.一个不属于引用模型的人.我要添加的这个字段是一个图像.这个领域的原因是从它建立另一个模型.
我有一个名为Image的模型,其中包含一些字段,这些字段通过使用单个models.ImageField()进行填充.此Image还有一个与Driftwood模型有关的models.ForeginKey().因此可以使用其关系集属性(driftwood.image_set)通过Driftwood的实例访问Image.
在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='')
解决方法:
这是你如何做到非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做同样的事情,只需添加下面的字段并假设它来自模型本身.
标签:python,django,django-forms,django-crispy-forms 来源: https://codeday.me/bug/20190609/1204269.html