从扩展的用户模型获取值错误

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

我正在尝试创建一个表单,以允许我更新扩展的用户模型,请参见下面的视图


def employee(request, pk):

    employee= Employee.objects.get(id=pk)
    user = User.objects.get(id=pk)
    user_form = UserForm(instance=user)
    Employee = EmployeeProfileForm(instance=employee)


    if 'edit_employee' in request.POST:
        if request.method == 'POST':
            user_form = UserForm(request.POST,instance=user)
            employee_form = EmployeeProfileForm(request.POST,instance=user.employee)

            if user_form.is_valid() and employee_form.is_valid():
                user = user_form.save()
                employee = employee_form.save(commit=False)
                employee.user = user
                employee.save()
                return redirect('/')

                return render(request, 'accounts/new_employee_profile.html', {'user_form': user_form,'employee_form':employee_form})

models.py

class UserManager(BaseUserManager):
    def create_user(self, email, password=None,is_active=True, is_staff=False, is_admin=False):
        if not email:
            raise ValueError("Users must have email address")
        user_obj = self.model(email = self.normalize_email(email))
        if not password:
            raise ValueError("Users must have a password")

        user_obj.set_password(password)
        user_obj.staff = is_staff
        user_obj.admin = is_admin
        user_obj.active = is_active
        user_obj.save(using=self._db)

        return user_obj

    def create_staffuser(self,email,password=None):
        user = self.create_user(email, password=password,is_staff=True)

        return user

    def create_superuser(self, email, password=None):
        user = self.create_user(email, password=password, is_staff=True, is_admin=True)

        return user



class User(AbstractBaseUser):

    email = models.EmailField(max_length=255,unique=True)
    active = models.BooleanField(default=True)
    staff = models.BooleanField(default=False)
    admin = models.BooleanField(default=False)


    USERNAME_FIELD = 'email'
    # email and password are required by default
    REQUIRED_FIELDS = []

    objects = UserManager()

    def __str__(self):
        return self.email

    def get_full_name(self):
        return self.email

    def get_short_name(self):
        return self.email

    def has_perm(self, perm, obj=None):
        return True

    def has_module_perms(self, app_label):
        return True

    @property
    def is_staff(self):
        return self.staff

    @property
    def is_admin(self):
        return self.admin

    @property
    def is_active(self):
        return self.active


class Employee(models.Model):


    user = models.OneToOneField(User,on_delete=models.CASCADE)
    full_name = models.CharField(max_length=200, null=True)
    birth_year = models.CharField(max_length=4, null=True)
    department = models.CharField(max_length=200, null=True, blank=True)
    profession = models.CharField(max_length=200, null=True, blank=True)



    def __str__(self):
        return self.full_name


forms.py



class UserForm(forms.ModelForm):

    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = '__all__'


    def clean_password2(self):

        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            raise forms.ValidationError("Passwords don't match")
        return password2

    def save(self, commit=True):

        user = super(RegisterForm, self).save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

class EmployeeProfileForm(ModelForm):
    class Meta:
        model = Employee
        fields = '__all__'

模板

<div class="row">
    <div class="col-md-12">
        <div class="card card-body">
            <form action="" method="POST">

                  {{user_form.as_p|crispy}}
                {{employee_form.as_p|crispy }}

                <hr>
                <input type="submit" name="Edit">
            </form>
        </div>
    </div>
</div>

根据下面的观点,我在下面收到一个错误

The view accounts.views.EmployeeProfile didn't return an HttpResponse object. It returned None instead.

我在访问模板之前有一个模板,如下所示更新表单

<td><a class="btn btn-sm btn-info" name= "edit_employee" href="{% url 'employee_profile' employee.id %}">Edit</a></td>

为了更新或编辑表单,我必须如何更改显示的代码?

鉴于表单是扩展的用户模型,即用户模型和雇员模型,因此需要同时更新和提交表单。

python django django-models django-forms django-views
1个回答
0
投票

每个视图都必须返回HttpResponse。您遇到的错误是不言自明的。

这里出现此错误,因为在if语句为假的情况下,您没有显式返回任何内容。

您尚未为所有if情况(如果这些情况为false编写其他情况),默认情况下将返回None,这不是django视图的预期返回数据类型。

if 'edit_employee' in request.POST:
        if request.method == 'POST':
        .
        .

参考:https://docs.djangoproject.com/en/3.0/topics/http/views/#a-simple-view

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