@nikidreiks

Почему не открывается страница редактирования, django?

Код, который работает корректно при редактировании поста. Но после добавления модели AbstractUser что-то пошло не так.
вьюха приложения publication:

@login_required
def edit_post(request, post_slug):
    post = get_object_or_404(Userpublication, slug=post_slug)
    # Проверка, является ли текущий пользователь автором поста
    if request.user != post.author:
     	messages.error(request, 'Вы не можете редактировать этот пост')
     	return redirect('feeds', post_slug=post.slug)
    if request.method == 'POST':
        form = PostEditForm(request.POST, instance=post)
        if form.is_valid():
            form.save()
            messages.success(request, 'Пост успешно отредактирован!') # Установка флеш-сообщения
            return redirect('feeds', post_slug=post.slug)  # Перенаправляем на страницу просмотра поста
    else:
        form = PostEditForm(instance=post)
    return render(request, 'publication/edit_post.html', {'form': form})


def get_edit_url(self):
    return reverse('edit_post', kwargs={'post_slug': self.slug})


форма приложения publication:

from django import forms
from .models import Userpublication

class PostEditForm(forms.ModelForm):
    class Meta:
        model = Userpublication
        fields = ['content']


модель приложения publication:

from django.db import models
from autoslug import AutoSlugField  # Импортируем AutoSlugField из библиотеки django-autoslug
from django.urls import reverse
from django.contrib.auth.models import User
from django.conf import settings
from user.models import ProfileUser  # Импортируем модель ProfileUser

class PublishedManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(is_published=1).order_by('-time_create')

class Userpublication(models.Model):
    author = models.ForeignKey(
        ProfileUser,  # Ссылка на модель ProfileUser
        on_delete=models.CASCADE,
        related_name='publications',
        blank=True,
        null=True,
    )
    slug = AutoSlugField(max_length=255, unique=True, populate_from='content')  # Используем AutoSlugField для автоматической генерации slug
    content = models.TextField('', blank=True)
    time_create = models.DateTimeField('Время создания', auto_now_add=True)
    time_update = models.DateTimeField('Время обновления', auto_now=True)
    is_published = models.BooleanField('Опубликовано ли', default=True)

    objects = models.Manager()
    published = PublishedManager()

    def __str__(self):
        return self.slug

    class Meta:
        ordering = ['-time_create']
        indexes = [
            models.Index(fields=['-time_create'])
        ]

    class Meta:
        verbose_name = 'Публикация'
        verbose_name_plural = 'Публикации'

    def get_absolute_url(self):
        return reverse('post_detail', kwargs={'post_slug': self.slug})

    def get_edit_url(self):
        return reverse('edit_post', kwargs={'post_slug': self.slug})


маршруты:

from django.urls import path
from . import views
from .views import edit_post
from usercreatepost.views import create_post
urlpatterns = [
    path('create/', create_post, name='create_posts'),
    path('<slug:post_slug>/', edit_post, name='feeds'),
    path('posts/<slug:post_slug>/', views.show_post, name='poserts'),
    path('post/<slug:post_slug>/', views.post_detail, name='post_detail'),
    path('edit_post/<slug:post_slug>/', views.edit_post, name='edit_post'),
]


ссылка на редактирование:

{% if request.user == post.author %}
    <a href="{{ post.get_edit_url }}" class="post_user_edit">Редактировать</a>
{% endif %}

Данный код работает корректно, но после того, как я добавил модель AbstractUser, ссылка не работает и вместо неё открывается верная ссылка по слагу, но с ошибкой:
Страница недоступна Сайт localhost выполнил переадресацию слишком много раз.

менял и на такую:
<a href="{% url 'edit_post' post_slug=post.slug %}" class="post_user_edit">Редактировать</a>


модель приложения user:
from django.db import models
from django.contrib.auth.models import AbstractUser

class ProfileUser(AbstractUser):
    bio = models.TextField(max_length=200, blank=True, null=True)
    first_name = models.CharField(max_length=40, blank=True, null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    birth_date = models.DateField(blank=True, null=True)
    verified = models.BooleanField(default=False)
    registration_date = models.DateTimeField(auto_now_add=True)  # Можно использовать auto_now_add для автоматического заполнения при создании
    avatar = models.ImageField(upload_to='avatars/', blank=True, null=True)
    is_active = models.BooleanField(default=True)
    author = models.ForeignKey(  # Добавляем поле author
        'publication.Userpublication',  # Ссылка на модель Userpublication
        on_delete=models.SET_NULL,
        related_name='author_profile',
        blank=True,
        null=True,
    )

    class Meta(AbstractUser.Meta):
        pass


вьеха приложения user:
@login_required
def user_profile(request):
    # Получаем текущего пользователя
    user = request.user

    # Получаем данные о пользователе из базы данных
    user_data = {
        'username': user.username,
        'first_name': user.first_name,
        'last_name': user.last_name,
        'email': user.email,
        'bio': user.bio,
        'birth_date': user.birth_date,
    }

    # Отображаем шаблон с данными о пользователе
    return render(request, 'user/profile.html', {'user_data': user_data})
  • Вопрос задан
  • 78 просмотров
Пригласить эксперта
Ответы на вопрос 1
RyanovskY
@RyanovskY
лично уменя была проблема с бесконечной переадресацией когда я попытался добавить форму для аутентификации, но без формы всё работало отлично.

я уэто уже описал тут: Почему не работает обработчик во views?

может декоратор так ужасно построен в джанго, надо попробовать осуществить переадресацию без декоратора.
принцип работы будет тот же но может стабильнее. сделать это можно через if

например так:

def my_view(request):
    if not request.user.is_authenticated:
        # Сохраняем путь страницы на которую хотели войти
        request.session['next'] = request.path
        return redirect(reverse('login'))  # 'login' - имя нашей страницы входа


def login_view(request):
# обычный код входа
    if login_success:
        next_url = request.session.get('next')  # Получаем сохраненный путь
        if next_url:
            del request.session['next']  # Удаляем сохраненный путь
            return redirect(next_url)  # Перенаправляем пользователя обратно
        else:
            return redirect(reverse('home'))


так мы избавляемся от декоратора
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы