提问者:小点点

要更改电子邮件/个人资料图片的表单未显示?


对此问题的任何指导都将不胜感激。我输入了必要的字段,这样在配置文件页面上,用户将能够编辑配置文件图片,用户名和电子邮件。当我创建表单时,它只显示update按钮和“Profile Info”文本。如何修复这一点,使编辑用户信息的表单出现?

在views.py中

'''

@login_required
def profile(response):
    if response.method == "POST":
        u_form = UserUpdateForm(response.POST, instance=response.user)
        p_form = ProfileUpdateForm(response.POST, response.FILES, instance=response.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            u_form.save()
            p_form.save()
            messages.success(response, f'Your account has been updated!')
            return redirect("/profile")

    else:
        u_form = UserUpdateForm(instance=response.user)
        p_form = ProfileUpdateForm(instance=response.user.profile)

        args = {}
        args['u_form']= u_form,
        args['p_form']= p_form
    return render(response, 'register/profile.html')

'''

在Forms.py'''中

from django import forms
#from django.contrib.auth. import login, authenticate
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
from django.contrib.auth.models import User
from .models import Profile
from django.forms import ModelForm


class RegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ["username", "email", "password1", "password2"]

class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ["username", "email"]


class ProfileUpdateForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ['image']

'''

在profile.html中

null

{% extends "register/base.html" %}
{% load crispy_forms_tags %}
{% block content %}
    <div class="content-section">
      <div class="media">
        <img class="rounded-circle account-img" src="{{ user.profile.image.url }}">
        <div class="media-body">
          <h2 class="account-heading">{{ user.username }}</h2>
          <p class="text-secondary">{{ user.email }}</p>
        </div>
      </div>
    <div class="container">
      <form method="post" enctype="multipart/form-data">
          {% csrf_token %}
          <fieldset class="form-group">
              <legend class="border-bottom mb-4">Profile Info</legend>
              {{ u_form|crispy }}
              {{ p_form|crispy }}
          </fieldset>
          <div class="form-group">
              <button class="btn btn-outline-info" type="submit">Update</button>
          </div>
      </form>
    </div>
{% endblock content %}

null


共1个答案

匿名用户

要呈现模板中的某个变量,必须将其作为上下文传递给模板。行中:

return render(response, 'register/profile.html')

你永远不会把上下文传递给它。render接受可选的第三个参数作为上下文。所以行应该是:

return render(response, 'register/profile.html', args)

注意:您将视图中的request参数接受为response!这是一个很大的用词不当!请求是用户向服务器发出的,响应是服务器返回的。您应该将参数接受为request