【问题标题】:Django Load form with the data populated from models使用从模型填充的数据的 Django 加载表单
【发布时间】:2019-12-21 12:10:03
【问题描述】:

我正在使用 Python(3.7) 和 Django(2.3) 开发一个项目,其中我通过扩展基本用户模型实现了多种类型的用户,现在我需要创建一个 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", 第 34 行,在内部 response = get_response(请求)文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base.py”, 第 126 行,在 _get_response 中 “改为返回无。” % (callback.module, view_name) ValueError: 视图dashboard.views.EditUserDashboard 没有返回 一个 HttpResponse 对象。它返回 None 代替。 [2019 年 12 月 21 日 20:07:16]“GET /dashboard/user/10/edit HTTP/1.1”500 53502

【问题讨论】:

  • @roganjosh 我已经添加了视图,对EditUserDashboard的获取请求出现错误
  • 是的。如果您的tryclass EditUserDashboard(generic.DetailView): 中失败会怎样?您的 except Exception as e 应该在控制台中打印某些内容,然后您返回 None
  • 是的,我的异常声明正在打印:'ContactPerson' object is not subscriptable
  • @roganjosh 我已经更新了forms.pyviews 中的表单,现在它正在根据获取请求加载表单,但字段为空,它应该加载填充数据的字段。跨度>

标签: python django python-3.x django-models django-views


【解决方案1】:

您可以尝试以下方法:

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

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

【讨论】:

  • 我已将语句更改为p = ContactPerson.objects.get(user__id=id),但仍然是同样的错误。
  • 我已经更新了forms.pyviews 中的表单,现在它正在根据获取请求加载表单,但字段为空,它应该加载填充数据的字段。
  • 好的,能否请您在user_edit.html中显示相关的sn-p。
  • 我已经添加了相关的HTML。
  • 为什么在一个表单标签中有两个单独的表单?这对我来说似乎很奇怪。这就像你试图做一个不接受预定义实例但以一种无法理解的方式(至少对我来说)的表单集。我的建议是暂时摆脱一种形式,只在视图和模板中使用 p_form,看看这是否有效,因为单个表单接受实例作为参数。如果我们的方法有效,您可能希望使用表单集在一页中预填充多个表单。这是另一个 ST 答案的链接,它很好地概述了实现这一点。
猜你喜欢
  • 2014-06-11
  • 2014-02-14
  • 2019-01-29
  • 2017-07-23
  • 2021-11-14
  • 2010-10-30
  • 2020-07-23
  • 2018-08-15
  • 1970-01-01
相关资源
最近更新 更多