【问题标题】:Getting an value error from extended user model从扩展用户模型中获取值错误
【发布时间】:2020-09-18 19:14:12
【问题描述】:

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


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})

模型.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】:

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

    您在此处收到此错误,因为如果您的 if 语句为假,您没有明确返回任何内容。

    如果这些情况为 false,默认情况下将返回 None,这不是 Django 视图的预期返回数据类型。

    显式返回HttpResponse,以防以下情况解决问题

    if 'edit_employee' in request.POST:
            if request.method == 'POST':
            .
            .
            if user_form.is_valid() and employee_form.is_valid():
    

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

    【讨论】:

    • 谢谢,我让表单出现在模板上,但是如果我要更改表单中的某些内容,它不会保存更改。如何更改上面显示的代码以允许表单保存更改。
    • 您不必更改表单,您必须处理表单无效的情况应该返回什么,
    猜你喜欢
    • 2015-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 2011-02-28
    相关资源
    最近更新 更多