Django - Как установить в форме значение по умолчанию для текущего пользователя?

быстрый вопрос начинающего Django, потому что я не смог найти ответ, который напрямую решает то, что мне нужно, или не добавляет кучу слишком сложной функциональности, которая мне не нужна.

У меня есть базовая настройка блога, с моделью для пользователей и связанных с ними записей, и формой для создания новых записей. Однако я хочу, чтобы поле "Автор" на форме автоматически заполнялось текущим зарегистрированным пользователем, а не выпадающим списком всех зарегистрированных пользователей. Моя модель:

class Post(models.Model):
    title = models.CharField(max_length=255)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    body = models.TextField()
    post_date = models.DateField(auto_now_add=True)
    category = models.CharField(max_length=255)
    site = models.CharField(max_length=255)
    def __str__(self):
        return self.title + ' | ' + str(self.author)
    def get_absolute_url(self):
        return reverse('home')

Моя форма:

class PostForm(forms.ModelForm):
 class Meta:
    model=Post
    fields = ('title', 'author', 'category', 'site', 'body')
    widgets = {
        'title': forms.TextInput(attrs={'class': 'form-control'}),
        'author': forms.Select(attrs={'class': 'form-control' ,'readonly': 'readonly'}),
        'category': forms.Select(choices=choice_list,attrs={'class': 'form-control'}),
        'site': forms.Select(choices=site_choice_list,attrs={'class': 'form-control'}),
        'body': forms.Textarea(attrs={'class': 'form-control'})
    }

Мое мнение:

class AddPostView(CreateView):
model = Post
form_class = PostForm
template_name = 'add_post.html'

Повторюсь, я просто хочу, чтобы поле "автор" в сообщении было только для чтения и заполнялось текущим зарегистрированным пользователем. Вместо того, чтобы пользователь мог выбирать из списка пользователей.

Заранее спасибо, дайте мне знать, если я могу предоставить что-нибудь еще, чтобы помочь вам помочь мне :)

Вам следует отключить поле, а не просто добавить атрибут readonly к виджету, поскольку "хакер" может подделать вредоносный HTTP-запрос, устанавливающий автора другим пользователем:

class PostForm(forms.ModelForm):

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.fields['author'].disabled = True
    
    class Meta:
        model = Post
        fields = ('title', 'author', 'category', 'site', 'body')
        widgets = {
            'title': forms.TextInput(attrs={'class': 'form-control'}),
            'author': forms.Select(attrs={'class': 'form-control'}),
            'category': forms.Select(choices=choice_list,attrs={'class': 'form-control'}),
            'site': forms.Select(choices=site_choice_list,attrs={'class': 'form-control'}),
            'body': forms.Textarea(attrs={'class': 'form-control'})
        }

Затем мы можем использовать эту форму в представлении с помощью:

from django.contrib.auth.mixins import LoginRequiredMixin

class AddPostView(LoginRequiredMixin, CreateView):
    model = Post
    form_class = PostForm
    template_name = 'add_post.html'

    def get_initial(self):
        return {'author': request.user}

Миксин LoginRequiredMixin [Django-doc] гарантирует, что только пользователи, которые вошли в систему, могут видеть (и взаимодействовать с) представление.

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