Код, который работает корректно при редактировании поста. Но после добавления модели 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})