Django - 来自数据库的 ModelForm 初始数据

Django - ModelForm initial data from database

在我的 Django 项目中,我创建了一个应用程序来获取有关注册用户的其他信息。所以我的模型看起来像这样:

class UserProfile(models.Model):
   class Meta:
      verbose_name_plural = u'User Profile'

   user = models.OneToOneField(User)
   birthday = models.DateField(blank=True, null=True)
   avatar = models.ImageField(upload_to='media/profile/avatar', blank=True, null=True)
   name = models.CharField(blank=True, null=True, max_length=20)
   surname = models.CharField(blank=True, null=True, max_length=50)
   phone = models.CharField(blank=True, null=True, max_length=12)

   def __unicode__(self):
      return '%s' % self.user

在用户配置文件中,我创建了模型表单,用户可以在其中填写或编辑 UserProfile 模型中的字段:

class ExtraProfileDataForm(ModelForm):
   name = forms.CharField(label=(u'Enter your name'))
   surname = forms.CharField(label=(u'Enter your surname'))
   phone = forms.CharField(label=(u'Enter your phone'))
   birthday = forms.DateField(label=(u'Enter birthday'))
   avatar = forms.ImageField(label=(u'Enter avatar'))

   class Meta:
      model = UserProfile
      fields = ('name', 'surname', 'phone', 'birthday', 'avatar')

   def __init__(self, *args, **kwargs):
      super(ExtraProfileDataForm, self).__init__(*args, **kwargs)
         for key in self.fields:
            self.fields[key].required = False

这是模型窗体的视图:

@login_required
def UserFullDataForm(request):
   if request.method == 'POST':
      form = ExtraProfileDataForm(request.POST)
         if form.is_valid():
            profile_user = request.user
            user_profile = UserProfile(user=profile_user)
            user_profile.name = form.cleaned_data['name']
            user_profile.surname = form.cleaned_data['surname']
            user_profile.phone = form.cleaned_data['phone']
            user_profile.birthday = form.cleaned_data['birthday']
            user_profile.avatar = form.cleaned_data['avatar']
            user_profile.save()
            return HttpResponseRedirect('/profile/')
          else:
            return render(request, 'profiles/extra_profile.html', {'form':form})
        else:
            form = ExtraProfileDataForm()
            context = {'form':form}
            return render (request, 'profiles/extra_profile.html', context)

但如果字段不为空,我想从模型 UserProfile 加载 ExtraProfileDataForm 初始数据。我在 Django 文档网站上搜索了如何执行此操作,但没有找到。有人可以帮助我了解该怎么做吗?非常感谢。

您使用 instance 参数。

请注意,您在这里所做的工作比必要的多得多;您的大部分视图都可以被剪切。

@login_required
def UserFullDataForm(request):
    try:
        profile = request.user.userprofile
    except UserProfile.DoesNotExist:
        profile = UserProfile(user=request.user)

    if request.method == 'POST':
        form = ExtraProfileDataForm(request.POST, instance=profile)
        if form.is_valid():
            form.save()
            return HttpResponseRedirect('/profile/')
        else:
            form = ExtraProfileDataForm(instance=profile)
        return render(request, 'profiles/extra_profile.html', {'form':form})

同样,在您的表单中,您不需要覆盖的 __init__ 方法,因为无论如何您都是手动指定所有字段;您可以在其中的每一个上添加 required=False。但是,您可以通过在 model 定义中添加标签来使其更短;那么您的整个模型形式可能只是:

class ExtraProfileDataForm(ModelForm):
    class Meta:
        model = UserProfile
        fields = ('name', 'surname', 'phone', 'birthday', 'avatar')

最后一点:您一直使用三个 space 缩进,这有点奇怪。大多数 Python 程序员更喜欢两个或四个。