我是Django的新手,目前正在从事辅助项目。 我有两个模型User和Profile,它们具有一对一的关系。
我创建了post_save信号,因此当新用户注册时,他的空配置文件实例已经在数据库中创建。
def create_profile(sender, instance, created, **kwargs):
if created:
Profile.objects.create(user=instance)
post_save.connect(create_profile, sender=CustomUser)
既然已经创建了配置文件,我想为什么不跳过CreateView并使用UpdateView保存配置文件表单。
这样做,我只需要为配置文件创建一种表单。所以我只有一个视图是UpdateView。
用户创建帐户时,他将被定向到“个人资料”(自动创建)表单,在该表单中他保存(更新)了自己的信息。
现在,当我提交表单时,在updateView模板中时,什么都没有保存在数据库中,但是,表单是通过管理面板成功保存的,并且由于数据库是更新表单,因此还可以正确地从数据库中填充字段。 我认为问题出在发布数据上,因为从管理员保存时字段显示正确的数据。
可能是什么问题?
查看
class ProfileSettingsView(UpdateView):
model = Profile
form_class = ProfileSettingsForm
pk_url_kwarg = 'pk'
context_object_name = 'object'
template_name = 'profile_settings.html'
def get_object(self):
pk = self.kwargs.get('pk')
return get_object_or_404(Profile, id=pk)
def get_context_data(self, **kwargs):
c_object = self.get_object()
context = super(ProfileSettingsView,
self).get_context_data(**kwargs)
context['linked_in'] = c_object.linked_in
context['facebook'] = c_object.facebook
print('context: ', context)
return context
模板
<form style="padding-left: 15px; padding-right:15px;" method="POST">
{% csrf_token %}
<h3>Basic Information</h3>
<div class="col-lg-6">
<div class="form-group">
<div class="field">
<label>Facebook<span class="red-txt">*</span></label>
<input class="form-control" type="text" name="facebook" value="{{ facebook }}" maxlength="60" size="50">
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<div class="field">
<label>Linked In<span class="red-txt">*</span></label>
<input class="form-control" type="text" name="linked_in" value="{{ linked_in }}" maxlength="60" size="50">
</div>
</div>
</div>
<div style="padding-bottom:30px; text-align:center;" class="login login-button">
{# <a href="" class="btn btn-outline-primary btn-lg"></a> #}
<input type="submit" class="btn btn-outline-primary btn-lg" value="Save Profile">
</div>
</form>
模型
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
linked_in = models.CharField(max_length=30, null=True, blank=True)
facebook = models.CharField(max_length=30, null=True, blank=True)
表格
class ProfileSettingsForm(forms.ModelForm):
class Meta:
model = Profile
fields = '__all__'
答案 0 :(得分:1)
您已经复制了表单,视图和模板的许多功能,并且这样做了,所以您绕过了那些会告诉您问题所在的内容。
您遇到的一个具体问题是您的表格无效。这是因为您已定义它以期望Profile模型上的所有三个字段,但是没有在提交的数据中提供用户。您不会在页面上看到此内容,因为您没有在显示表单给您的错误,也没有在重新显示输入的数据。 Django可以为您完成这两项工作,但是您可以通过硬编码HTML中的字段来避免它们。
此外,您的大多数视图代码都不相关。您的视图应仅如下所示:
class ProfileSettingsView(UpdateView):
model = Profile
form_class = ProfileSettingsForm
template_name = 'profile_settings.html'
,因为所有方法和其他属性都是不必要的。您的表格应为:
class ProfileSettingsForm(forms.ModelForm):
class Meta:
model = Profile
fields = ['linked_in', 'facebook']
widgets = {
'linked_in': forms.TextInput({'class': 'form-control'}),
'facebook': forms.TextInput({'class': 'form-control'}),
}
现在您的模板可以是:
<form style="padding-left: 15px; padding-right:15px;" method="POST">
{{ form.errors }}
{% csrf_token %}
<h3>Basic Information</h3>
<div class="col-lg-6">
<div class="form-group">
<div class="field">
<label>Facebook<span class="red-txt">*</span></label>
{{ form.facebook }}
</div>
</div>
</div>
<div class="col-lg-6">
<div class="form-group">
<div class="field">
<label>Linked In<span class="red-txt">*</span></label>
{{ form.linked_in }}
</div>
</div>
</div>
<div style="padding-bottom:30px; text-align:center;" class="login login-button">
{# <a href="" class="btn btn-outline-primary btn-lg"></a> #}
<input type="submit" class="btn btn-outline-primary btn-lg" value="Save Profile">
</div>
</form>