Django - 来自数据库的 ModelForm 初始数据
Posted
技术标签:
【中文标题】Django - 来自数据库的 ModelForm 初始数据【英文标题】:Django - ModelForm initial data from database 【发布时间】:2016-06-12 12:53:04 【问题描述】:在我的 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 文档网站上搜索了如何做到这一点,但没有找到。有人可以帮助我了解如何做吗?非常感谢。
【问题讨论】:
【参考方案1】:您使用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')
最后一点:您一直在使用三空格缩进,这有点奇怪。大多数 Python 程序员更喜欢两个或四个。
【讨论】:
非常感谢!我在另一篇文章中找到了你的答案。 ***.com/a/7350469/4592608以上是关于Django - 来自数据库的 ModelForm 初始数据的主要内容,如果未能解决你的问题,请参考以下文章
Django ModelForm 向导 - 如何创建数据库对象?
如何在 Django 中向 ModelForm 添加外键字段?