使用CustomUser模型添加和删除朋友

时间:2020-10-22 17:34:39

标签: python django

现在我在为朋友功能启动添加/删除视图时遇到了一些麻烦。 主要错误是'WSGIRequest'对象没有属性'CustomUser' 在页面上显示用户列表时,我也遇到麻烦。 我确定问题出在使用自定义用户模型,但是我找不到适合它的解决方案。 这些总是错误字符串:

Friends.make_friend(request.CustomUser, new_friend) 
Friends.lose_friend(request.CustomUser, new_friend) 

这是我的编辑代码,该代码可以正常运行:

views.py:

def change_friends(request, operation, pk):
    new_friend = CustomUser.objects.get(pk=pk)
    if operation == 'add':
        Friends.make_friend(request.user, new_friend)
    elif operation == 'remove':
        Friends.lose_friend(request.user, new_friend)
    return redirect('/users/user_list')

def users_list(request):
    users = CustomUser.objects.exclude(email=request.user.email)
    friend = Friends.objects.get_or_create(current_user = request.user)
    friend = Friends.objects.get(current_user = request.user)
    print(type(friend))
    friends = friend.users.all().exclude(email=request.user.email)
    user_list = CustomUser.objects.all().exclude(email=request.user.email)
    user_dict = {'user_list' : user_list, 'friends' : friends}
    return render(request, 'users\\users_list.html', context = user_dict)

models.py:

class Friends(models.Model):
    users = models.ManyToManyField(CustomUser, related_name = 'friend_set')
    current_user = models.ForeignKey(CustomUser, related_name = 'owner', null = True, on_delete = models.CASCADE)

    @classmethod
    def make_friend(cls, current_user, new_friend):
        friend, created = Friends.objects.get_or_create(
            current_user=current_user
        )
        friend.users.add(current_user, new_friend)

    @classmethod
    def lose_friend(cls, current_user, new_friend):
        friend, created = Friends.objects.get_or_create(
            current_user=current_user
        )
        friend.users.remove(current_user, new_friend)

users / urls.py:

urlpatterns = [
    path('login/', auth_views.LoginView.as_view(template_name = "users/login.html"), name='login'),
    path('logout/', auth_views.LogoutView.as_view(), name = 'logout'),
    path('signup/', views.SignUp.as_view(), name = 'signup'),
    path('user_list/', views.users_list, name = "user_list"),
    re_path(r'^connect/(?P<operation>.+)/(?P<pk>\d+)/$', views.change_friends, name = 'change_friends'),
]

managers.py:

from django.contrib.auth.base_user import BaseUserManager
from django.utils.translation import ugettext_lazy as _


class CustomUserManager(BaseUserManager):
    """
    Custom user model manager where email is the unique identifiers
    for authentication instead of usernames.
    """
    def create_user(self, email, password, **extra_fields):
        """
        Create and save a User with the given email and password.
        """
        if not email:
            raise ValueError(_('The Email must be set'))
        email = self.normalize_email(email)
        user = self.model(email=email, **extra_fields)
        user.set_password(password)
        user.save()
        return user

    def create_superuser(self, email, password, **extra_fields):
        """
        Create and save a SuperUser with the given email and password.
        """
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('is_active', True)

        if extra_fields.get('is_staff') is not True:
            raise ValueError(_('Superuser must have is_staff=True.'))
        if extra_fields.get('is_superuser') is not True:
            raise ValueError(_('Superuser must have is_superuser=True.'))
        return self.create_user(email, password, **extra_fields)

admin.py:

from django.contrib import admin
from django.contrib.auth.admin import UserAdmin

from .forms import CustomUserCreationForm, CustomUserChangeForm
from .models import CustomUser, Friends

from . import models
# Register your models here.

class CustomUserAdmin(UserAdmin):
    add_form = CustomUserCreationForm
    form = CustomUserChangeForm
    model = CustomUser
    list_display = ('email', 'is_staff', 'is_active',)
    list_filter = ('email', 'is_staff', 'is_active',)
    fieldsets = (
        (None, {'fields': ('first_name', 'last_name', 'email', 'password', 'birth_date', 'gender')}),
        ('Permissions', {'fields': ('is_staff', 'is_active')}),
    )
    add_fieldsets = (
        (None, {
            'classes': ('wide',),
            'fields': ('email', 'password', 'is_staff', 'is_active')}
        ),
    )
    search_fields = ('email',)
    ordering = ('email',)

admin.site.register(CustomUser, CustomUserAdmin)
admin.site.register(Friends)

users_list.html:

{% if user_list %}
    <div class="container">
      <ul>
        {% for users in user_list %}

          <li style='padding: 4px'>{{ users.first_name }} {{ users.last_name }}
            {% if not users in friends %}
            <a href="{% url 'users:change_friends' operation='add' pk=users.pk %}">
            <button type="button">Add</button>
            </a>
            {% endif %}
          </li>

        {% endfor %}
      </ul>
    </div>
    {% endif %}

    <h2>Friends list:</h2>
    {% if user.is_authenticated %}

    {% for friend in friends %}


    <li>{{ friend.first_name }} {{ friend.last_name }}</li>
    <a href="{% url 'users:change_friends' operation='remove' pk=friend.pk %}">
    <button type="button">Remove</button>
    </a>



    {% endfor %}

    {% else %}

    <p>You don't have friends yet!</p>

    {% endif %}

在settings.py中添加了:

AUTH_USER_MODEL = 'users.CustomUser'

1 个答案:

答案 0 :(得分:0)

WSGI对象不包含function toggleTheme() { document.body.classList.toggle('dark-mode'); var btn = document.getElementById("myButton"); if (btn.textContent === "Dark Mode") return btn.textContent = "Day Mode"; btn.textContent = "Dark Mode" } ,而仅包含CustomUser对象。

因此,请将user函数更改为

change_friends