在djang更新用户及其用户配置文件

2024-04-20 15:10:59 发布

您现在位置:Python中文网/ 问答频道 /正文

如何将用户字段数据和用户配置文件数据绑定到视图中的模型窗体,我只在使用instance=User时将用户数据呈现到窗体中,而在instance=profile上不呈现任何用户配置文件的数据,我需要的是将所有用户及其配置文件呈现到窗体中。你知道吗

型号.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')

主管_更新.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">&times;</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>

Tags: instance用户namedivformfieldmodelsas
1条回答
网友
1楼 · 发布于 2024-04-20 15:10:59

将额外字段与用户实例一起传入initial应该是可行的


    initial = {'su_mobile_number': profile.su_mobile_number}
    form = SupervisorSignUpForm(instance=user, initial=initial)

或者如果您不想手动创建dict,您可以使用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

相关问题 更多 >