首页 > 解决方案 > 我怎样才能让用户改变他自己的形象不仅仅是从管理员

问题描述

我正在尝试找到一种方法让用户更改自己的图像,但我做不到,因为我是 Django 新手,如果您能以与我的代码流相同的方式帮助我,请不要不要感到困惑,或者如果你能解释一下谢谢,Forms.py

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm, UserChangeForm

from accounts.models import UserProfile


class RegistrationForm(UserCreationForm):
    email = forms.EmailField(required=True)

    class Meta:
        model = User
        fields = (
            'username',
            'first_name',
            'last_name',
            'email',
            'password1',
            'password2'
        )

    def save(self, commit=True):
        user = super(RegistrationForm, self).save(commit=False)
        user.first_name = self.cleaned_data['first_name']
        user.last_name = self.cleaned_data['last_name']
        user.email = self.cleaned_data['email']

        if commit:
            user.save()

        return user


class EditProfileForm(UserChangeForm):
    template_name='/something/else'

    class Meta:
        model = User
        fields = (
            'email',
            'first_name',
            'last_name',
            
        )

模型.py

from django.db import models
from django.contrib.auth.models import User
from django.db.models.signals import post_save

class UserProfileManager(models.Manager):
    def get_queryset(self):
        return super(UserProfileManager, self).get_queryset().filter(city='London')

class UserProfile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    description = models.CharField(max_length=100, default='')
    city = models.CharField(max_length=100, default='')
    website = models.URLField(default='')
    phone = models.IntegerField(default=0)
    image = models.ImageField(upload_to='image/', blank=True)

    objects = models.Manager()
    london = UserProfileManager()

    def __str__(self):
        return self.user.username

def create_profile(sender, **kwargs):
    if kwargs['created']:
        user_profile = UserProfile.objects.create(user=kwargs['instance'])

post_save.connect(create_profile, sender=User)

个人资料.Html

{% extends 'base.html' %}
{% load static %}

{% block head %}
<title>Profile</title>
{% endblock %}

{% block content %}

<div class="container">
  <br><br>
  <div class="row">
    <br><br>
    <div class="col-4">
      {% if user.userprofile.image %}
      <img class="UserImage" src="{{ user.userprofile.image.url }}" height="240" width="240">

        {% else %}
          <img class="UserImage image" src="{% static 'defaultui.jpg' %}" height="240" width="240">

      {% endif %}
    </div>

  <div class="col-4">
    <h1>Profile</h1>
    <p><b>Username:</b> {{ user }}</p>
    <p><b>First name:</b> {{ user.first_name }}</p>
    <p><b>Last name:</b> {{ user.last_name }}</p>
    <p><b>Email:</b> {{ user.email }}</p>
    <p><b>Description:</b>Description: {{ user.userprofile.description }}</p>
    <p><b>Phone:</b> {{ user.userprofile.phone }}</p>
    <p><b>City:</b> {{ user.userprofile.city }}</p>
    <p><b>Website:</b> {{ user.userprofile.website }}</p>

  </div>

    </div>
    <h1>Your Posts</h1>
</div>

{% endblock %}

编辑 profile.html

{% extends 'base.html' %}




{% block content %}
<div class="container">
    <form method="post">
        {% csrf_token %}
        {{ form.as_p }}
         <a href="{% url 'change_password' %}"><button type="button"  class="btn btn-success"  name="button">Change Password</button></a>
        <button class="btn btn-primary" type="submit">Submit</button>
    </form>
    <br>
</div>

{% endblock %}

视图.py

from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.urls import reverse
from accounts.forms import (
    RegistrationForm,
    EditProfileForm
)
from products.models import Product
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserChangeForm, PasswordChangeForm
from django.contrib.auth import update_session_auth_hash
from django.contrib.auth.decorators import login_required

def register(request):
    if request.method =='POST':
        form = RegistrationForm(request.POST)
        if form.is_valid():
            form.save()
            return redirect('home')
    else:
        form = RegistrationForm()

    args = {'form': form}
    return render(request, 'accounts/reg_form.html', args)

def view_profile( request, pk=None):
    product = Product()
    if pk:
        user = User.objects.get(pk=pk)
    else:
        user = request.user
    args = {'user': user, 'product':product}
    return render(request, 'accounts/profile.html', args)

def edit_profile(request):
    if request.method == 'POST':
        form = EditProfileForm(request.POST, instance=request.user)

        if form.is_valid():
            form.save()
            return redirect('view_profile')
    else:
        form = EditProfileForm(instance=request.user)
    args = {'form': form}
    return render(request, 'accounts/edit_profile.html', args)

def change_password(request):
    if request.method == 'POST':
        form = PasswordChangeForm(data=request.POST, user=request.user)

        if form.is_valid():
            form.save()
            update_session_auth_hash(request, form.user)
            return redirect('view_profile')
        else:
            return redirect('change_password')
    else:
        form = PasswordChangeForm(user=request.user)

    args = {'form': form}
    return render(request, 'accounts/change_password.html', args)
def login(request):
    if request.method == 'POST':
        user = auth.authenticate(username=request.POST['username'],password=request.POST['password'])
        if user is not None:
            auth.login(request, user)
            return redirect('home')
        else:
            return render(request, 'accounts/login.html',{'error':'username or password is incorrect.','user':user})
    else:
        return render(request, 'accounts/login.html')

def logout(request):
    if request.method == 'POST':
        auth.logout(request)
        return redirect('home')

标签: pythondjango

解决方案


尝试使用 ModelForm 作为表单并使用 UserProfile 来更改图像,而不是 User。类似于:

class UserChangeProfileForm(ModelForm):
 class Meta:
     model = UserProfile
     fields = ['image']

此外,检查并使用清晰的表单,而不是手动声明它们。


推荐阅读