UNIQUE约束失败:更新用户信息时auth_user.username

问题描述 投票:0回答:1

我试图让用户通过ModelForm更改他/她的名/姓。当我按下提交时,我遇到UNIQUE约束失败:auth_user.username错误。这是我的代码:

学生/ forms.py:

class EditProfileForm(UserChangeForm):
    def clean_password(self):
        # Overriding the default method because I dont want user to change 
        # password
        pass

     class Meta:
        model = User
        fields = (
            'first_name',
            'last_name',
        )

学生/ views.py:

User = get_user_model()

def student_profile_view(request, slug):
    if request.method == 'GET':

        # forms
        edit_name_form = EditProfileForm(instance=request.user)

        context = {
            'edit_name_form': edit_name_form,
        }
        return render(request, "students/profile.html", context)

class ChangeNameView(SuccessMessageMixin, UpdateView):
        template_name = 'students/edit_profile.html'
        model = User
        form_class = EditProfileForm
        success_message = "Your name has been updated"

        def post(self, request, *args, **kwargs):
            form = self.get_form()
            if form.is_valid():
            form.instance.student_profile = StudentProfile.objects.get(slug=request.user.student_profile.slug)
                return self.form_valid(form)
            else:
                return self.form_invalid(form)

        def form_valid(self, form):
            """If the form is valid, save the associated model."""
            form.instance.username = self.request.user
            self.object = form.save(commit=False)
            return super().form_valid(form)

        def get_success_url(self):
            return reverse('students:student_profile_view', kwargs={'slug': self.object.student_profile.slug})

还有fyi,用户模型是StudentProfile的外键。

学生/ models.py:

class StudentProfile(models.Model):
    user = models.OneToOneField(User, related_name='student_profile', on_delete=models.CASCADE)
    slug = models.SlugField(blank=True, unique=True)
    avatar = models.ImageField(upload_to='student_profile/', null=True, blank=True)
    description = models.CharField(max_length=120, null=True, blank=True)

    objects = models.Manager()

    def __str__(self):
        return self.user.username

    def get_absolute_url(self):
        return reverse("students:student_profile_view", kwargs={"slug": self.slug})

我对基于类的视图很新,所以也许我在那里做错了什么?

django django-users
1个回答
0
投票

我假设您没有表单中的用户,因此您需要表单

def get_context_data (self, *args, **kwargs)
    ctx = super().get_context_data(*args, **kwargs)
    if self.request.method == 'POST':
        ctx['form'] = EditProfileForm(instance=self.request.user)

并删除def form_valid()

© www.soinside.com 2019 - 2024. All rights reserved.