繁体   English   中英

Django 加载表单,其中包含从模型填充的数据

[英]Django Load form with the data populated from models

我正在使用 Python(3.7) 和 Django(2.3) 开发一个项目,其中我通过扩展 Base 用户模型实现了多种类型的用户,现在我需要创建一个 UserEdit 页面以允许工作人员编辑用户。

这是我的模型:

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(max_length=254, unique=True)
    name = models.CharField(max_length=255)
    title = models.CharField(max_length=255, choices=TITLE, blank=False)
    user_type = models.CharField(max_length=255, choices=USER_TYPE, blank=False)
    gender = models.CharField(max_length=255, choices=CHOICES, blank=False)
    contenst = models.CharField(max_length=255, blank=True, null=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    last_login = models.DateTimeField(null=True, blank=True)
    date_joined = models.DateTimeField(auto_now_add=True)
    email_status = models.CharField(max_length=50, default='nc')

    USERNAME_FIELD = 'email'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ['password']

    objects = UserManager()

    def get_absolute_url(self):
        return "/users/%i/" % (self.pk)

    def __str__(self):
        return str(self.email)


class PersonalBelow18(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='profile')
    dob = models.DateField(blank=False)
    customer_id = models.IntegerField(blank=False, verbose_name='Connect other User')
    collection_use_personal_data = models.BooleanField(blank=False)
    reference_identities = models.ForeignKey(Identities, blank=False, on_delete=models.CASCADE, related_name='refs')

    def __str__(self):
        if self.user.email is None:
            return "ERROR-CUSTOMER NAME IS NULL"
        return str(self.user.email)

    GRAPPELLI_AUTOCOMPLETE_SEARCH_FIELDS = {
        "myapp": {
            "MyFile": ("user__email__icontains",)
        }
    }


class PersonalAbove18(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    dob = models.DateField(blank=False)
    customer_id = models.IntegerField(blank=False, verbose_name='Connect other User')
    contact_email = models.EmailField(max_length=255, blank=False)
    reference_identities = models.ForeignKey(Identities, blank=False, on_delete=models.CASCADE)
    contact_no = PhoneNumberField(blank=True, null=True, max_length=13,
                                  help_text='Phone number must be entered in the'
                                            'format: \'+999999999\'. Up to 13 digits allowed.')

    collection_use_personal_data = models.BooleanField(blank=False)

    def __str__(self):
        print(type(self.user.email))
        if self.user.email is None:
            return "ERROR-CUSTOMER NAME IS NULL"
        return str(self.user.email)


class ContactPerson(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    contact_email = models.EmailField(blank=False)
    customer_id = models.BigIntegerField(blank=True)
    contact_no = PhoneNumberField(blank=True, null=True, help_text='Phone number must be entered in the'
                                                                   'format: \'+999999999\'. Up to 15 digits allowed.')
    collection_use_personal_data = models.BooleanField(blank=False)


class GroupContact(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    contact_email = models.EmailField(blank=False)
    customer_id = models.BigIntegerField(blank=False)
    contact_no = PhoneNumberField(blank=True, help_text='Phone number must be entered in the'
                                                        'format: \'+999999999\'. Up to 15 digits allowed.')
    department = models.CharField(max_length=255, blank=False)
    address = models.CharField(max_length=255, blank=False)

这是我的表格:

class UserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ('email', 'name', 'password1', 'password2', 'title',
                  'gender', 'contenst', 'user_type')

   class Below18Form(forms.ModelForm):
    class Meta:
        model = PersonalBelow18
        widgets = {'dob': DateInput()}
        fields = ('dob', 'customer_id', 'collection_use_personal_data')

class Above18Form(forms.ModelForm):
    class Meta:
        model = PersonalAbove18
        widgets = {'dob': DateInput()}
        fields = ('dob', 'customer_id',
                  'contact_email',
                  'contact_no', 'collection_use_personal_data')

class UserCPForm(forms.ModelForm):
    class Meta:
        model = ContactPerson
        fields = ('contact_email', 'contact_no', 'collection_use_personal_data')

class GroupContactForm(forms.ModelForm):
    class Meta:
        model = GroupContact
        fields = ('contact_email', 'contact_no', 'department', 'address')

这是我用来组合多个表单的MultiModelForm

这是我的观点:

class EditUserDashboard(generic.DetailView):
    def get(self, request, *args, **kwargs):
        id = self.kwargs['id']
        try:
            u = User.objects.get(id=id)
            print(u.user_type)
            u_form = UserForm(request.POST, instance=u)
            if u.user_type == 'PB':
                p = PersonalBelow18.objects.get(user_id=id)
                p_form = Below18Form(request.POST, instance=p)
                return render(request, 'dashboard/user_edit.html', {'u_form': u_form,
                                                                    'p_form': p_form,
                                                                    'u': u})
            elif u.user_type == 'PA':
                p = PersonalAbove18.objects.get(user_id=id)
                p_form = Above18Form(request.POST, instance=p)
                return render(request, 'dashboard/user_edit.html', {'u_form': u_form,
                                                                    'p_form': p_form,
                                                                    'u': u})
            elif u.user_type == 'ContactPerson':
                p = ContactPerson.objects.get(user_id=id)
                print(p.user.id)
                p_form = UserCPForm(request.POST, instance=p)
                return render(request, 'dashboard/user_edit.html', {'u_form': u_form,
                                                                    'p_form': p_form,
                                                                    'u': p})
            elif u.user_type == 'GC':
                p = GroupContact.objects.get(user_id=id)
                p_form = GroupContactForm(request.POST, instance=p)
                return render(request, 'dashboard/user_edit.html', {'u_form': u_form,
                                                                    'p_form': p_form,
                                                                    'u': u})
            else:
                print('something else')
        except Exception as e:
            print(e)
            pass

更新:我的 HTML 表单:

<form action="" method="post" class="form">
     {% csrf_token %}
     {{ u_form|crispy }}
     {{ p_form|crispy }}
     <button type="submit" class="btn btn-primary" value="update">Update</button>
</form>

当我加载编辑页面时,它返回的错误为:

“ContactPerson”对象不可下标

内部服务器错误:/dashboard/user/10/edit Traceback(最近一次调用最后一次):文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers /exception.py", line 34, in internal response = get_response(request) File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base. py”,第 126 行,在 _get_response “返回 None 。” %(回调模块,VIEW_NAME)ValueError异常:视图dashboard.views.EditUserDashboard没有返回HttpResponse对象。 它返回 None 。 [21/Dec/2019 20:07:16] "GET /dashboard/user/10/edit HTTP/1.1" 500 53502

您可以尝试以下操作:

p = ContactPerson.objects.get(user__id=id)  # instead of user_id=id

或者

p = ContactPerson.objects.get(user=u)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM