python - 在 django 中更新用户及其用户配置文件
问题描述
如何将用户字段数据和用户配置文件数据绑定到视图上的模型表单,当我使用实例 = 用户时,我只将用户数据呈现到表单,但它不会在实例 = 配置文件上呈现用户配置文件的任何数据,我需要的是将所有用户及其个人资料呈现为表单。
模型.py
class User(AbstractUser):
is_supervisor = models.BooleanField(default=False)
is_student = models.BooleanField(default=False)
class Supervisor(models.Model):
user = models.OneToOneField('User', on_delete=models.CASCADE, primary_key=True, related_name='supervisor')
su_mobile_number = models.CharField(max_length=200)
视图.py
def supervisor_update(request, user_id):
# user = get_object_or_404(User, pk=user_id)
user = get_object_or_404(User, pk=user_id)
profile = get_object_or_404(Supervisor, pk=user_id)
if request.method == 'POST':
form = SupervisorSignUpForm(request.POST, instance=user)
else:
form = SupervisorSignUpForm(instance=user)
return save_user_form(request, form, 'partials/partial_supervisor_update.html')
表格.py
class SupervisorSignUpForm(UserCreationForm):
su_mobile_number = forms.CharField(label="Mobile Number")
class Meta(UserCreationForm.Meta):
model = User
fields = ('username', 'email', 'password1', 'password2', 'first_name', 'last_name')
supervisor_update.html
{% load crispy_forms_tags %}
<form method="post" action="{% url 'supervisor_update' form.instance.pk %}" class="js-supervisor-update-form">
{% csrf_token %}
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">Update Supervisor</h4>
</div>
<div class="modal-body">
{% include 'partials/form_messages.html' %}
{{ form.username|as_crispy_field }}
{{ form.email|as_crispy_field }}
{{ form.first_name|as_crispy_field }}
{{ form.last_name|as_crispy_field }}
{{ form.su_mobile_number|as_crispy_field }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-danger" data-dismiss="modal">Close</button>
<button type="submit" class="btn btn-primary">Update Supervisor</button>
</div>
</form>
解决方案
要设置与用户实例一起传入初始的额外字段应该可以工作
initial = {'su_mobile_number': profile.su_mobile_number}
form = SupervisorSignUpForm(instance=user, initial=initial)
或者,如果您不想手动创建字典,您可以使用 model_to_dict
from django.forms.models import model_to_dict
initial = model_to_dict(profile, exclude=['user'])
form = SupervisorSignUpForm(instance=user, initial=initial)
同样在您的视图顶部,您假设用户和主管具有相同的 id,但事实并非如此,而是您可以做这样的事情
user = user = get_object_or_404(User, pk=user_id)
profile = user.supervisor
if not profile:
raise Http404
推荐阅读
- angular - 角。控制台不显示输入值
- c# - 我通过 Form1 打开 5 个不同的表格,但我无法保存所有职位
- sitecore - Sitecore 8.2:EXM 3.3 更新 1 未显示创建常规活动的电子邮件模板
- swift - 类型'Void'在函数中没有枚举结果的成员
- r - 如何在使用 r 中的符号()命令更新散点图后添加图例
- php - 使用角度 $http 从 php api 请求数据时出错
- swift - Swift Alamofire 使用 UIWebView 向 VC 请求回答
- google-maps - 在 iOS 上关闭信息窗口
- css - SCSS - 将代码与参数组合/缩短/简化?
- ffmpeg - ffmpeg不正确的屁股字幕边框宽度