Как удалить суперпользователя в django
Перейти к содержимому

Как удалить суперпользователя в django

  • автор:

Django — Admin Area — Не могу удалить пользователя из пользователей (Пользователь, соответствующий запросу, не существует).

Я создал приложение «Пользователи». В моделях я создаю Профиль и сигналы. В админке я могу создать нового пользователя, в конце создается профиль. Когда я удаляю форму нового пользователя, профиль также удаляется из Users и все нормально. Но если я пытаюсь удалить нового пользователя из области Users, я получаю сообщение об ошибке: «DoesNotExist at /admin/auth/user/3/delete/ — User matching query does not exist». Я не знаю почему? Есть какие-нибудь предложения?

Я запустил и применил все миграции, а также удалил и создал другую базу данных, но это не решило проблему.

from django.db import models from django.contrib.auth.models import User from PIL import Image from ckeditor_uploader.fields import RichTextUploadingField # Create your models here. class Profil(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True) username = models.CharField(max_length=200, blank=True, null=True) nume = models.CharField(max_length=200, blank=True, null=True) avatar = models.ImageField ( upload_to ='utilizatori/', default='utilizatori/avatar_profilearning.jpg', verbose_name='Avatar (320px * 320px)') departament = models.CharField(max_length=200, blank=True, null=True) functie = models.CharField(max_length=200, blank=True, null=True) email = models.EmailField(max_length=500, blank=True, null=True) descriere = RichTextUploadingField(external_plugin_resources=[( 'emojione', '/static/src/plugins/ckeditor_plugins/emojione/' , 'plugin.js', )], config_name='default') creat = models.DateTimeField(auto_now_add=True) #pentru a redimensiona rezolutia avatarului incarcat def save(self, *args, **kawrgs): super().save(*args, **kawrgs) img = Image.open(self.avatar.path) if img.height > 320 or img.width > 320: output_size = (320, 320) img.thumbnail(output_size) img.save(self.avatar.path) def __str__(self): return str(self.user.username) class Meta: verbose_name = 'Profil' verbose_name_plural = 'Profil' 
from django.contrib.auth.models import User from .models import Profil from django.db.models.signals import post_save, post_delete from django.dispatch import receiver def creareProfil(sender, instance, created, **kawrgs): if created: user = instance profil = Profil.objects.create( user=user, username=user.username, email=user.email, nume=user.first_name, ) def stergeUser(sender, instance, **kawrgs): user = instance.user user.delete() post_save.connect(creareProfil, sender=User) post_delete.connect(stergeUser, sender=Profil) 
from django.apps import AppConfig class UtilizatoriConfig(AppConfig): default_auto_field = 'django.db.models.BigAutoField' name = 'utilizatori' def ready(self): import utilizatori.signals 

В вашей модели профиля у вас есть:

user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True) 

с on_delete=models.CASCADE models.CASCADE уже удаляет экземпляр при удалении, а в вашем signals.py у вас есть:

post_delete.connect(stergeUser, sender=Profil) 

Возможно, при удалении пользователя django удаляет и экземпляр Profile, вызывая сигнал post_delete .

Вы можете попробовать удалить сигнал post_delete и действие удаления будет работать нормально.

Как удалить пользователя в Django и DRF с помощью сериализаторов и общих представлений

Я пытаюсь сделать CRUD функции пользователя, я сделал другие функции, но не могу понять, как удалить пользователя с помощью API, Было бы также здорово, если бы вы могли сделать обзор кода, правильно ли я делаю, и безопасным ли способом.

Вот сериализаторы, которые я использую:

serializers.py

 from .models import User class UserSerializer(serializers.ModelSerializer): password = serializers.CharField( max_length=128, min_length=8, write_only=True ) class Meta: model = User fields = ('email', 'password', 'first_name', 'last_name') extra_kwargs = < 'password': , 'first_name': , 'last_name': , > def create(self, validated_data): user = User( email = validated_data['email'], first_name = validated_data['first_name'], last_name = validated_data['last_name'] ) user.set_password(validated_data['password']) user.save() return user class UpdateUserSerializer(serializers.ModelSerializer): email = serializers.EmailField(required=True) class Meta: model = User fields = ('first_name', 'last_name', 'email') extra_kwargs = < 'first_name': , 'last_name': , > def validate_email(self, value): user = self.context['request'].user if User.objects.exclude(pk=user.pk).filter(email=value).exists(): raise serializers.ValidationError() return value def update(self, instance, validated_data): user = self.context['request'].user if user.pk != instance.pk: raise serializers.ValidationError() instance.first_name = validated_data['first_name'] instance.last_name = validated_data['last_name'] instance.email = validated_data['email'] instance.save() return instance 

views.py

from rest_framework import generics from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from django.contrib.auth import get_user_model from .serializers import UserSerializer, UpdateUserSerializer, ChangePasswordSerializer # Create your views here. class UserCreate(generics.CreateAPIView): authentication_classes = () permission_classes = () serializer_class = UserSerializer class ChangePasswordView(generics.UpdateAPIView): User = get_user_model() queryset = User.objects.all() permission_classes = (IsAuthenticated,) serializer_class = ChangePasswordSerializer class UpdateUserView(generics.UpdateAPIView): User = get_user_model() queryset = User.objects.all() permission_classes = (IsAuthenticated,) serializer_class = UpdateUserSerializer class HelloView(APIView): permission_classes = (IsAuthenticated, ) def get(self, request): content = return Response(content) 

urls.py

from django.urls import path from rest_framework_simplejwt import views from .views import ( UserCreate, UpdateUserView, ChangePasswordView, HelloView ) urlpatterns = [ path('create/', UserCreate.as_view(), name='user_create'), path('token/', views.TokenObtainPairView.as_view(), name='token_optain_pair'), path('token/refresh/', views.TokenRefreshView.as_view(), name='token_refresh'), path('hello/', HelloView.as_view(), name='hello'), path('update//', UpdateUserView.as_view(), name='update_user'), path('change_password//', ChangePasswordView.as_view(), name='auth_change_password'), ] 

Я изучаю Django и DRF, поэтому, пожалуйста, дайте мне знать, если я делаю что-то не так, спасибо

class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = '__all__' class UserDeleteApi(generics.DestroyAPIView): queryset = User.objects.all() serializer_class = UserSerializer path('api//delete',UserDeleteApi.as_view()) 

Вы можете попробовать этот способ

Администрирование Django

Чтобы добавлять, редактировать и удалять записи, для которых мы только что создали модель, мы используем панель управления администратора Django.

Давай откроем файл blog/admin.py и заменим его содержимое на:

from django.contrib import admin from .models import Post admin.site.register(Post) 

Как ты можешь заметить, мы импортировали (включили) модель Post, которую определили в предыдущей главе. Чтобы наша модель стала доступна на странице администрирования, нам нужно зарегистрировать её при помощи admin.site.register(Post) .

Хорошо, теперь нам нужно взглянуть на модель Post. Не забудь запустить веб-сервер командой python manage.py runserver . Перейди в браузер и набери адрес http://127.0.0.1:8000/admin/. Ты увидишь страницу авторизации:

Страница авторизации

Чтобы залогиниться, тебе сначала нужно создать суперпользователя (англ. superuser) — пользователя, который имеет полный доступ к управлению сайтом. Вернись к командной строке, набери python manage.py createsuperuser , и нажми Enter.

Не забудь: чтобы выполнять команды во время работы сервера, открой новое окно терминала и активируй в нём виртуальное окружение. Мы описывали ввод новых команд в разделе Запуск веб-сервера главы Твой первый проект на Django!.

При появлении запроса введи имя пользователя (строчными буквами, без пробелов), адрес электронной почты и пароль. Не беспокойся, если пароль не появляется на экране по мере ввода, так и задумано. Просто напечатай его и нажми Enter , чтобы продолжить. Результат должен выглядеть следующим образом (имя пользователя и почта, соответственно, будут твоими):

(myvenv) ~/djangogirls$ python manage.py createsuperuser Username: admin Email address: admin@admin.com Password: Password (again): Superuser created successfully. 

Вернись в браузер и войди в систему при помощи имени пользователя и пароля, которые ты только что выбрала. Ты должна попасть в панель управления Django.

Администрирование Django

Перейди к разделу Posts и немного поэкспериментируй с ним. Добавь пять или шесть постов. Не беспокойся о содержании — можешь просто скопировать и вставить текст из этого учебника, чтобы сэкономить время 🙂

Убедись, что выбрала для двух или трёх записей (но не больше) дату публикации. Это пригодится позднее.

Администрирование Django

Если ты хочешь узнать больше об администрировании Django, то ознакомься с этим разделом официальной документации: https://docs.djangoproject.com/en/1.11/ref/contrib/admin/.

Сейчас, вероятно, подходящий момент, чтобы порадовать себя кружечкой кофе (или чая), а также съесть чего-нибудь для восполнения энергии. Ты только что создала свою первую модель Django и заслужила перерыв!

results matching » «

No results matching » «

Каким образом можно удалить объект из видимости одного пользователя на сайте django?

Хочу сделать на сайте возможность удалять объект из видимости пользователя. Например, есть блог, где любой незарегистрированный пользольвователь (авторизации вообще нет) может просматривать ленту новостей. Каждая новость имеет кнопку «Не интересно». Если нажать на эту кнопку, то данная новость должна исчезнуть для этого пользователя. Для остольных пользователей новость должны быть видна. Есть какие-то идеи как это можно реализовать на python django?

  • Вопрос задан более года назад
  • 105 просмотров

6 комментариев

Простой 6 комментариев

AlbertForest @AlbertForest
А что именно не получается? Идентифицировать пользователя? Скрыть объект?

Nie_yar

nik rik @Nie_yar Автор вопроса

i3a4em, я в целом не понимаю как это можно реализовать, так как недавно начал изучать пайтон, в том числе и джанго.

AlbertForest @AlbertForest

nik rik,
Идентификация пользователя. Тут куча вариантов на любой вкус и все это легко гуглится.
Для примера давай банально сгенерируем uuid uid = uuid.uuid4()
и запишем в куки HttpResponse.set_cookie(‘uid’, uid )

Допустим у нас есть модель в базе

class User(models.Model): uid= models.CharField(max_length=64) rejected_news= models.ManyToManyField(News, null=True)

Сохраняем юзера
User(uid=uid).save()

По нажатию кнопки находим новость и добавляем в отклоненные
user.rejected_news.add(news)

На странице удаляем объект с новостью

При загрузке страницы первым делом ищем юзера и получаем его отклоненные новости.
Удаляем их из результатов выборки всех новостей и генерим страницу

Nie_yar

nik rik @Nie_yar Автор вопроса
i3a4em, спасибо, сейчас буду пробовать.

Nie_yar

nik rik @Nie_yar Автор вопроса

6395db686ae72486342018.png

i3a4em, Добрый день. Наконец-то дошли руки до этого. Хотел бы попросить вас о помощи, так как столкнулся с проблемой при реализации вашего варианта: при сохранении uid в таблице я получаю значения в rejected , хотя их я не указывал. User(user_uid=uid).save()

AlbertForest @AlbertForest

nik rik, Если вопрос еще актуален.
По факту их нет. Это сделано для того, что бы руками можно было выбрать нужное. Реально существующие связи будут выделены.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *