Django - ModelForm:添加一个不属于模型的字段
Django - ModelForm: Add a field not belonging to the model
注意:为我的表单使用 django-crispy-forms
库。如果您对我的问题有一个不使用 cripsy_forms
库的解决方案,我同样接受。不要挑剔,只需要一个解决方案/解决方法。谢谢
在我的表单 Meta
class 中,我设置了模型 Driftwood
,它是我想要在表单中添加的字段,但我还想添加另一个字段。一个不属于引用模型的模型。我要添加的这个字段是一张图片。这个字段的原因是要从中构建另一个模型。
我有一个名为 Image
的模型,它有一些字段是通过使用单个 models.ImageField()
来填充的。这个 Image
还有一个 models.ForeginKey()
与 Driftwood
模型有关。因此 Image
可以通过 Driftwood
的实例使用其关系集 属性 (driftwood.image_set
).
来访问
在 view.py
中,我使用 generic.CreateView()
作为继承的 class 来处理我的表单 class。我打算用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
中指定的模型class,但您将能够对该字段做任何您想做的事情。
我不确定你,但我想你可以用 django-crispy-forms 做同样的事情,只需添加下面的字段并假设它来自模型本身。
这是更新后的表格,以防有人好奇。
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')
)
)
注意:为我的表单使用 django-crispy-forms
库。如果您对我的问题有一个不使用 cripsy_forms
库的解决方案,我同样接受。不要挑剔,只需要一个解决方案/解决方法。谢谢
在我的表单 Meta
class 中,我设置了模型 Driftwood
,它是我想要在表单中添加的字段,但我还想添加另一个字段。一个不属于引用模型的模型。我要添加的这个字段是一张图片。这个字段的原因是要从中构建另一个模型。
我有一个名为 Image
的模型,它有一些字段是通过使用单个 models.ImageField()
来填充的。这个 Image
还有一个 models.ForeginKey()
与 Driftwood
模型有关。因此 Image
可以通过 Driftwood
的实例使用其关系集 属性 (driftwood.image_set
).
在 view.py
中,我使用 generic.CreateView()
作为继承的 class 来处理我的表单 class。我打算用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
中指定的模型class,但您将能够对该字段做任何您想做的事情。
我不确定你,但我想你可以用 django-crispy-forms 做同样的事情,只需添加下面的字段并假设它来自模型本身。
这是更新后的表格,以防有人好奇。
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')
)
)