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] гарантирует, что только пользователи, которые вошли в систему, могут видеть (и взаимодействовать с) представление.