Почему авторизованный пользователь не видит ссылку на редактирование поста?
Друзья, после успешной авторизации не удается сделать ссылку на редактирование поста.
Что не так делаю?
В шаблоне ввожу ссылку на редактирование поста, и вместо первого значения "Редактировать", выдает второе - "Войдите, чтобы отредактировать".
{% if request.user == post.user %}<a href="{% url 'edit_post' post_slug=post.slug %}" class="post_user_edit">Редактировать</a>
{% else %}
<a href="{% url 'user:login' %}" class="post_user_edit">Войдите, чтобы отредактировать</a>
{% endif %}
Хотя показывает, что пользователь авторизован:
{% if user.is_authenticated %}
<a class="menu-item" href="{% url 'user:logout' %}">Выйти</a>
{% else %}
<a href="{% url 'user:login' %}">Войти</a>
Приложение publication:
views.py:
from django.shortcuts import render, get_object_or_404, redirect
from django.http import HttpResponse, HttpResponseNotFound, Http404
from publication.models import Userpublication
from django.urls import reverse
from .forms import PostEditForm
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.views import LoginView
from django.contrib.auth.decorators import login_required
def indexs(request):
posted = Userpublication.published.filter(is_published=1)
return render(request, 'publication/post.html', {'post_lists': posted})
def show_post(request, post_slug, *args, **kwargs):
post = get_object_or_404(Userpublication, slug=post_slug)
data = {
'user': post.user,
'content': post.content,
'post': post,
}
return render(request, 'publication/post_user.html', data)
@login_required
def edit_post(request, post_slug):
post = get_object_or_404(Userpublication, slug=post_slug)
# Проверяем, является ли текущий пользователь авторизованным
if not request.user.is_authenticated:
return HttpResponseForbidden("Для редактирования поста требуется авторизация.")
# Проверяем, является ли текущий пользователь автором поста
if post.user != request.user:
return HttpResponseForbidden("У вас нет разрешения на редактирование этого поста.")
if request.method == 'POST':
form = PostEditForm(request.POST, instance=post)
if form.is_valid():
form.save()
return redirect(post) # Перенаправляем на страницу просмотра поста
else:
form = PostEditForm(instance=post)
return render(request, 'user/test.html', {'form': form})
urls.py:
from django.urls import path
from . import views
urlpatterns = [
path('post/', views.indexs, name='posert'),
path('posts/<slug:post_slug>/', views.show_post, name='poserts'),
]
models.py:
from django.db import models
from django.urls import reverse
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(is_published=1).order_by('-time_create')
class Userpublication(models.Model):
user = models.CharField('Пользователь', max_length=255)
slug = models.SlugField(max_length=255, unique=True, db_index=True)
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.user
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('poserts', kwargs={'post_slug': self.slug})
forms.py:
from django import forms
from .models import Userpublication
class PostEditForm(forms.ModelForm):
class Meta:
model = Userpublication
fields = ['content']
Приложение user:
views.py:
from django.contrib.auth import authenticate, login, logout
from django.http import HttpResponse, HttpResponseRedirect, HttpResponseForbidden
from django.shortcuts import render
from django.urls import reverse, reverse_lazy
from django.views.generic import CreateView
from .forms import LoginUserForm, RegisterUserForm
from django.contrib.auth.views import LoginView
from django.contrib.auth.forms import AuthenticationForm
from django.contrib.auth.decorators import login_required
class LoginUser(LoginView):
form_class = LoginUserForm
template_name = 'user/login.html'
extra_context = {'title': 'авторизация'}
def get_success_url(self):
return reverse_lazy('home')
#dispatch отвечает за предотвращение повторной авторизации
def dispatch(self, request, *args, **kwargs):
if request.user.is_authenticated:
return HttpResponseRedirect(self.get_success_url())
return super().dispatch(request, *args, **kwargs)
def logout_user(request):
logout(request)
return HttpResponseRedirect(reverse('user:login'))
class RegisterUser(CreateView):
form_class = RegisterUserForm
template_name = 'user/reg.html'
extra_context = {'title': "Регистрация"}
success_url = reverse_lazy('user:login')
urls.py:
from django.urls import path
from . import views
app_name = 'user'
urlpatterns = [
path('', views.LoginUser.as_view(), name='login'),
path('logout/', views.logout_user, name='logout'),
path('reg/', views.RegisterUser.as_view(), name='reg'),
]
forms.py:
from django import forms
from django.contrib.auth import get_user_model
from django.contrib.auth.forms import UserCreationForm, AuthenticationForm
class LoginUserForm(AuthenticationForm):
username = forms.CharField(label='',#логин
widget=forms.TextInput(attrs={'class': 'input_field', 'placeholder': 'Ваш логин'}))
password = forms.CharField(label='',#пароль
widget=forms.PasswordInput(attrs={'class': 'input_field', 'placeholder': 'Ваш пароль'}))
class Meta:
model = get_user_model()
fields = ['username', 'password']
labels = {
'username': '222',
'password': '222'
}
widgets = {
'username': forms.TextInput(attrs={'class': 'input_field', 'placeholder': 'Логин'}),
'password': forms.TextInput(attrs={'class': 'input_field', 'placeholder': 'Пароль'}),
}
class RegisterUserForm(UserCreationForm):
username = forms.CharField(label='',
widget=forms.TextInput(attrs={'class': 'input_field', 'placeholder': 'Ваш логин'}))
password1 = forms.CharField(label='',
widget=forms.PasswordInput(attrs={'class': 'input_field', 'placeholder': 'Ваш пароль'}))
password2 = forms.CharField(label='',
widget=forms.PasswordInput(attrs={'class': 'input_field', 'placeholder': 'Подтвердите пароль'}))
class Meta:
model = get_user_model()
fields = ['username', 'email', 'first_name', 'last_name',
'password1', 'password2']
labels = {
'email': '',
'first_name': '',
'last_name': ''
}
widgets = {
'email': forms.TextInput(attrs={'class': 'input_field', 'placeholder': 'E-mail'}),
'first_name': forms.TextInput(attrs={'class': 'input_field', 'placeholder': 'Имя'}),
'last_name': forms.TextInput(attrs={'class': 'input_field', 'placeholder': 'Фамилия'}),
}
def clean_email(self):
email = self.cleaned_data['email']
if get_user_model().objects.filter(email=email).exists():
raise forms.ValidationError("Такой E-mail уже существует!")
return email
Используйте для поля автора публикации внешний ключ к User
из django.contrib.auth
, а не CharField
from django.contrib.auth.models import User
class Publication(models.Model):
author = models.ForeignKey(User, on_delete=models.CASCADE)