【问题标题】:display parent field on django forms在 Django 表单上显示父字段
【发布时间】:2014-04-01 03:45:30
【问题描述】:

我正在开发一个基于 Django 的网站。我现在正在创建表单以供用户填写。

首先,我要显示一个由用户填写的 UserProfileForm,但我需要显示 User 类具有的字段“用户名”、“名字”和“姓氏”。

其次,我正在显示一个表单来创建一个吉祥物对象,但我需要显示一个图像字段,它位于另一个名为 Image 的类中。

这些是我的课程(models.py):

class Mascot(models.Model):

    name = models.CharField(max_length=50)
    race = models.CharField(max_length=50)
    birth_date = models.DateField(blank=True, null=True)

    def __str__(self):
        return self.name

class Image(models.Model):
    mascot = models.ForeignKey(Mascot)
    image = models.ImageField(upload_to = 'pic_folder/%Y/%m/%d', default =     'pic_folder/None/no-img.jpg')
    is_profile_pic = models.BooleanField()

这是我的表单(forms.py):

class MascotForm(forms.ModelForm):

class Meta:
    model = Mascot

所以,我需要在 MascotForm 上显示 Image 对象。 谢谢。

【问题讨论】:

    标签: django web django-forms


    【解决方案1】:

    您可以简单地将 ImageFormField 添加到 MascotForm 并覆盖 save 方法来创建 Image 实例,如下所示:

    class MascotForm(forms.ModelForm):
        image = forms.ImageField()
    
        class Meta:
            model = Mascot
    
        def save(self, commit=True):
            # mascot will have to save in this case, we don't pass commit
            mascot = super(MascotForm, self).save()
            image = Image.objects.create(mascot=mascot,
                                         image=self.cleaned_data.get('image'))
            return mascot
    

    这是一种方法。但更好的方法是在视图中同时包含这两种形式。 为 Image 模型创建一个 ImageForm 并在视图中处理保存:

        class ImageForm(forms.ModelForm):
            class Meta:
                model = Image
                fields = ('image',)
    
            def save(self, mascot, commit=True):
                image = super(ImageForm, self).save(commit=False)
                image.mascot = mascot
                if commit:
                    image.save()
                return image
    
        def my_view(request):
            if request.method == 'POST':
                mascot_form = MascotForm(request.POST)
                image_form = ImageForm(request.POST, request.FILES)
    
                if mascot_form.is_valid() and image_form.is_valid():
                    mascot = mascot_form.save()
                    image = image_form.save(mascot)
                    return redirect(....)
            else:
                mascot_form = MascotForm()
                image_form = ImageForm()
            return render(request, 'some_template.html', {
                'mascot_form': mascot_form,
                'image_form': image_form
            })
    

    【讨论】:

    • 我在使用第一个解决方案时遇到了问题。图片字段出现在表单中,但我无法上传所选图片。当我单击提交按钮时,页面只是告诉我图像字段是必需的,但什么也不做。
    • 我做到了,我使用了第二种解决方案,现在我在我的表单中显示图像并上传它。现在我有另一个问题,当我提交表单时,图像文件会获得默认路径。 image = models.ImageField(upload_to = 'pic_folder/%Y/%m/%d', default = 'pic_folder/None/no-png.png')
    • 你能去掉默认的,看看它得到什么路径吗?
    • 我删除了默认值,现在表单告诉我图像字段是必需的。
    • 如果您不上传图片,您希望值为 'pic_folder/None/no-png.png'?
    猜你喜欢
    • 2017-07-20
    • 2021-11-10
    • 2017-07-29
    • 2020-10-24
    • 1970-01-01
    • 2019-01-08
    • 2015-08-20
    • 2019-05-02
    相关资源
    最近更新 更多