Django Crispy Form filter by is_staff
У меня есть форма для загрузки статей, но как мне отфильтровать авторов, чтобы она показывала только пользователей с ролью is_staff, мне также нужно, чтобы она показывала авторов как имена пользователей, а не адреса электронной почты
Вот мой forms.py
class ArticleForm(forms.ModelForm):
tags = TagField(required=False, widget=LabelWidget)
class Meta:
model = Article
fields = ('article_name', 'author', 'content', 'tags', 'status')
Вот мой views.py
class ArticleCreateView(LoginRequiredMixin, CreateView):
model = Article
form_class = ArticleForm
template_name = 'main_website/new_article.html' # <app>/<model>_<viewtype>.html
def form_valid(self, form):
form.instance.author = self.request.user
form.save()
return super().form_valid(form)
def get_context_data(self, **kwargs):
articles = Article.objects.filter(status=1).order_by('-date_posted')[:2]
context = super().get_context_data(**kwargs)
context['articles'] = articles
context['title'] = 'New Article'
return context
Вот мой models.py
class Article(models.Model):
class Status(models.IntegerChoices):
Draft = 0
Published = 1
article_name = models.CharField(max_length=200, unique=True)
slug = models.SlugField(max_length=200, unique=True)
author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='news_updates')
updated_on = models.DateTimeField(auto_now=True)
content = models.TextField()
tags = TaggableManager()
date_posted = models.DateTimeField(default=timezone.now)
status = models.IntegerField(choices=Status.choices, default=Status.Draft, help_text=_('Decide whether you want to Publish the news article or save it as a Draft'))
class Meta:
ordering = ['-date_posted']
def __str__(self):
return self.article_name
def get_absolute_url(self):
return reverse("main_website_article_detail", args=[str(self.slug)])
def save(self, *args, **kwargs):
self.slug = slugify(self.article_name)
super(Article, self).save(*args, **kwargs)
class ArticleForm(forms.ModelForm):
tags = TagField(required=False, widget=LabelWidget)
author = forms.ModelChoiceField(queryset=User.objects.filter(is_staff=True))
class Meta:
model = Article
fields = ('article_name', 'author', 'content', 'tags', 'status')
И для вашего второго вопроса (взятого из документации django):
Метод str() модели будет вызван для создания строкового представления объектов для использования в выборе поля. Чтобы создать собственные представления, создайте подкласс ModelChoiceField и переопределите label_from_instance. Этот метод получит объект модели и должен вернуть строку, подходящую для его представления. Например:
from django.forms import ModelChoiceField
class MyModelChoiceField(ModelChoiceField):
def label_from_instance(self, obj):
return "My Object #%i" % obj.id