(Django)此用户的特定人员模型已存在

时间:2018-03-14 16:50:36

标签: python django

亲爱的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(), 
        }

2 个答案:

答案 0 :(得分:0)

您需要将实例传递给表单,否则Django会在您保存时尝试创建新对象。

def post(self, request):
    form = ModelOfParticularPersonForm(instance=self.get_object(), self.request.POST, self.request.FILES)
    ...

当您使用基于通用类的视图时,应该尽量避免覆盖getpost。您最终可能会失去功能或不得不重复代码。在这种情况下,您似乎可以删除post方法。在form_valid方法中,您可以返回JsonResponse。如果要更新现有对象,则不必设置form.instance.user

def form_valid(self, form):
    profile = form.save()
    return JsonResponse(profile)

最后,您应该将useruploaded_at等字段保留在模型表单之外,而不是将其隐藏在字段中。

答案 1 :(得分:0)

您正在post视图方法中创建新论坛,但您没有将现有模型对象传递给它。这导致新模型的创建失败,因为对象已经存在。

不是覆盖post方法,而是将对象保存在is_valid方法中,并使用已提供的表单对象(通过方法参数传递给您)。