python - 使用从模型填充的数据的 Django 加载表单
问题描述
我正在使用 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 行,内部响应 = get_response(request) 文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/django/core/handlers/base. py”,第 126 行,在 _get_response 中“改为返回 None。” % (callback.module , 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)
推荐阅读
- c# - 上传文件到 GLPI 服务器 POST_MAX_SIZE
- selenium-webdriver - Selenium:如何处理 Web 表中的编辑框
- node.js - 在使用 Node.js 在 Oracledb 中运行过程之前如何在实例中设置 Autocommit gobal
- unity3d - 非玩家对象的多人 [SyncEvent] 问题
- ios - 如何在 Firebase IOS 中搜索值
- sql - 带有快速范围的 Grafana 仪表板链接
- java - 从 ArrayDeque 获取元素的时间复杂度
- excel - Excel - 在间接使用列时出错
- php - .htaccess 代码在创建漂亮的 url 时给出 500 内部错误
- batch-file - 在文本文件中查找特定行并使用批处理文件对其进行更新