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'}),

    }
Вернуться на верх