如何在 Django 中加载表单时使用模型的外键字段值预填充表单字段

问题描述 投票:0回答:1

我有以下型号:

class Member(models.Model):
    member_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)

class Photo(models.Model):
    photo_id = models.AutoField(primary_key=True)
    member_photo = models.ImageField(upload_to='member/', null=True, blank=True)
    member = models.ForeignKey(Member, on_delete=models.CASCADE)

我创建了模型表单、用于创建和更新成员类的通用视图。

从这里开始,我希望能够直接从“会员”的 ListView 将会员的照片上传到第二个模型“照片”,通过添加到 CreateView 的链接来上传照片。

用于添加照片的ModelForm和CreateView是:

模型表格

class MemberPhotoAddForm(forms.ModelForm):
    class Meta:
        model = Photo
        fields = ('member', 'member_photo')
        widgets = {
            'member': forms.TextInput(attrs={'placeholder': 'Type name...', }),
            'member_photo': forms.FileInput(attrs={'onchange': 'readURL(this)'}),
            }

创建视图

class PhotoUpload(CreateView):
    template_name = "member_photo_add.html"
    model = Photo
    form_class = MemberPhotoAddForm

    success_url = reverse_lazy('member_list') # URL for the ListView for Member class

    # I am trying to use method 'get_inital()' to pass 'member_id' to the form to add a 'Photo'
    def get_initial(self):
        member = self.request.GET.get('Member')
        return {
            'member': member,
            }

在 urls.py 中,我有:

    ...
    path('member_acct/photos/add/<int:pk>', views.PhotoUpload.as_view(), name='member_photo_add'),
    ...

在我的模板中,我遍历字段以显示字段(及其值)。

但是,正如我打算做的那样,当加载表单(用于添加照片)时,我无法填充成员的主键值 - 该字段仍为空白。

(在 SO 的帖子中,我读过一些海报,大意是

手动浏览所有可能未显示初始值的字段

但是诉诸于使用普通的

form.as_p
也没有帮助。

我正在尝试的方法是正确的吗?一些指导将不胜感激。

django django-views django-forms
1个回答
0
投票

通过这样修改

CreateView
解决了这个问题:

def get_initial(self):
    member = self.kwargs['pk']    # << Here
    return {
        'member': member,
        }

在罗斯曼先生的帮助下

© www.soinside.com 2019 - 2024. All rights reserved.