Django - как использовать модель текущего пользователя, который вошел в систему (таким образом, чтобы он не мог выбрать другого пользователя)
я хочу сделать блог на django, чтобы любой пользователь мог создавать посты, а пост принадлежал только этому пользователю .Автором поста должен быть текущий пользователь, который вошел в систему и никогда не меняться. у меня проблема получить текущего пользователя в модели поста !!!
как мне хранить ток, который написал пост, в модели поста?
from django.db import models
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils import timezone
from ckeditor.fields import RichTextField
class Post(models.Model):
STATUS_CHOICES = {
}
TECHNOLOGY_CHOICES = {
}
title = models.CharField(max_length=250)
slug = models.SlugField(max_length=250,unique_for_date='publish')
author = models.ForeignKey(User,on_delete=models.CASCADE,)
body = RichTextField(config_name='default',blank=True, null=True)
publish = models.DateTimeField(default=timezone.now)
created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft')
category = models.CharField(max_length=250,default='other')
def __str__(self):
return self.title + ' | ' + str(self.author)
def get_absolute_url(self):
return reverse('index')
также у нас есть django mixins, чтобы сделать что-то подобное для нас django mixins предназначен для системы аутентификации, если мы используем класс view в файле views.py, как показано ниже, django показывает любому пользователю 404 страницу для редактирования и удаления, кроме пользователя создателя поста :
если мы импортируем :
from django.contrib.auth.mixins import (
LoginRequiredMixins,
UserPassesTestMixin
)
и использовать их в классе View :
class PostUpdateView(LoginRequiredMixin,UserPassesTestMixin,CreateView):
model = Post
form_class = PostUpdateForm
template_name = 'weblog/post/post_update.html'
def test_func(self):
obj = self.get_object()
return obj.author == self.request.user
class DeletePostView(LoginRequiredMixin,UserPassesTestMixin,UpdateView):
model = Post
template_name = 'weblog/post/post_delete.html'
success_url = reverse_lazy('index')
def test_func(self):
obj = self.get_object()
return obj.author == self.request.user
С этим кодом нам не нужно было даже изменять html для проверки пользователя.
страница поста html :
<div class="form-group">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-primary"> Update Now</button>
</form>
</div>
если мы сделаем представление для создания поста и используем CreateView для его настройки, как показано ниже, текущий пользователь будет отправлен в базу данных :
class PostCreateView(CreateView):
model = Post
form_class = PostCreateForm
template_name = 'weblog/post/post_create.html'
def form_valid(self,form):
form.instance.author = self.request.user
return super().form_valid(form)
Просто помните, что если вы используете форму создания поста или поля в представлениях, не используйте пользователя-автора в полях. Этот код отправляет текущего пользователя в базу данных. А для редактирования поста вы можете проверить, является ли текущий пользователь автором поста, и показать страницу редактирования html :
{% if user.id == post.author.id %}
<div class="form-group">
<form method="post">
{% csrf_token %}
{{ form.as_p }}
<button class="btn btn-primary"> Update Now</button>
</form>
</div>
{% else %}
<h2>there is no such page for you ! </h2>
{% endif %}
а PostCreateForm и PostUpdateForm в forms.py - это :
class PostCreateForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title','slug','body','status')
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'slug': forms.TextInput(attrs={'class': 'form-control'}),
'body': RichTextField(config_name='default'),
'status': forms.Select(attrs={'class': 'form-control'}),
}
class PostUpdateForm(forms.ModelForm):
class Meta:
model = Post
fields = ('title','slug','body','status',)
widgets = {
'title': forms.TextInput(attrs={'class': 'form-control'}),
'slug': forms.TextInput(attrs={'class': 'form-control'}),
'body': RichTextField(config_name='default'),
'status': forms.Select(attrs={'class': 'form-control'}),
}