亲爱的StackOverFlow社区,
基于内置用户用户模型我创建了自己的模型类“ModelOfParticularPerson”。它的结构如下所示:
class ModelOfParticularPerson(models.Model):
user = models.OneToOneField(User)
nickname = models.CharField(max_length=100, null=True, unique=False)
uploaded_at = models.DateTimeField(auto_now_add=True, null=True)
email_address = models.EmailField(max_length=200, blank=False, null=False, help_text='Required')
description = models.CharField(max_length=4000, blank=True, null=True)
created = models.DateTimeField(auto_now_add=True, blank=True)
不幸的是,在使用特定帐户登录后,每当我尝试重新编辑配置文件时,我都会收到以下错误: “此用户的特定人员模型已存在。” 任何建议都是无价的。 感谢。
PS。 views.py: [..]
@method_decorator(login_required, name='dispatch')
class ProfileUpdateView(LoginRequiredMixin, UpdateView):
model = ModelOfParticularPerson
form_class = ModelOfParticularPersonForm
success_url = "/accounts/profile/" # You should be using reverse here
def get_object(self):
# get_object_or_404
return ModelOfParticularPerson.objects.get(user=self.request.user)
def form_valid(self, form):
form.instance.user = self.request.user
return super().form_valid(form)
def post(self, request):
form = ModelOfParticularPersonForm(self.request.POST, self.request.FILES)
if form.is_valid():
print("FORM NOT VALID!")
profile = form.save(commit=False)
profile.user = self.request.user
profile.save()
return JsonResponse(profile)
else:
return render_to_response('my_account.html', {'form': form})
urls.py:
urlpatterns = [
[..]
url(r'^login/$', auth_views.LoginView.as_view(template_name='login.html'), name='login'),
url(r'^accounts/profile/$', ProfileUpdateView.as_view(template_name='my_account.html'), name='my_account'),
]
forms.py
class ModelOfParticularPersonForm(ModelForm):
class Meta:
model = ModelOfParticularPerson
fields = '__all__'
widgets = {
'user':forms.HiddenInput(),
'uploaded_at':forms.HiddenInput(),
'created':forms.HiddenInput(),
}
答案 0 :(得分:0)
您需要将实例传递给表单,否则Django会在您保存时尝试创建新对象。
def post(self, request):
form = ModelOfParticularPersonForm(instance=self.get_object(), self.request.POST, self.request.FILES)
...
当您使用基于通用类的视图时,应该尽量避免覆盖get
或post
。您最终可能会失去功能或不得不重复代码。在这种情况下,您似乎可以删除post
方法。在form_valid
方法中,您可以返回JsonResponse
。如果要更新现有对象,则不必设置form.instance.user
。
def form_valid(self, form):
profile = form.save()
return JsonResponse(profile)
最后,您应该将user
和uploaded_at
等字段保留在模型表单之外,而不是将其隐藏在字段中。
答案 1 :(得分:0)
您正在post
视图方法中创建新论坛,但您没有将现有模型对象传递给它。这导致新模型的创建失败,因为对象已经存在。
不是覆盖post
方法,而是将对象保存在is_valid
方法中,并使用已提供的表单对象(通过方法参数传递给您)。