Я пытаюсь показать пользователю портфель ios, который он создал, но сейчас форма показывает пользователю все портфели ios, созданные им. В идеале я хотел бы отфильтровать это в view.py, но, возможно, фильтрация в models.py также может быть хорошим подходом, поскольку мне понадобится это в нескольких формах в приложении.
Сообщение может принадлежать ко многим различным портфелям ios. Подобно тому, как статья о походах может относиться к нескольким категориям (на открытом воздухе, фитнес, природа, путешествия и т. Д. c.) Единственное, что я хочу показать пользователю только «категории» или в нашем случае Портфель ios которые они создали, а не других пользователей.
Я занимаюсь этим уже несколько дней и читаю Djangos docs по queryset и manytomany плюс прошли через бесчисленное множество другие руководства и вопросы SOF. Я слишком усложняю все это? Кажется, что это должно быть очень просто.
Любая помощь будет очень цениться.
views.py
class PostCreate(CreateView):
model = Post
form_class = PostCreateForm
def get_queryset(self):
return Portfolio.objects.filter(user=self.request.user).order_by('created')
Models.py
class Portfolio(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
name = models.CharField(max_length=20)
description = models.CharField(max_length=250, blank=True, null=True)
class Post(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
title = models.CharField(max_length=50)
body = RichTextUploadingField(blank=True, null=True)
associated_portfolios = models.ManyToManyField(Portfolio, blank=True)
created_on = models.DateField(auto_now_add=True, editable=False)
post_form. html
{% extends 'dashboard/base.html' %}
{% block content %}
<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
<h1 class="display-4 mb-0 text-gray-800">My Posts</h1>
<a role="button" class="btn btn-success" href=" {% url 'post-list' %} "><i
class="fas fa-list"></i> All Posts</a>
</div>
<form role="form" method="post">
{% csrf_token %}
{{ form.media }}
{{ form.as_p }}
<input type="submit" class="btn btn-success" value="Create">
</form>
{% endblock %}
Я обнаружил работающее решение может добавить его в качестве окончательного решения, если я не столкнусь с некоторыми проблемами с ним или мы не обнаружим лучшее решение здесь. Я еще не уверен, будет ли это работать со всеми моими формами. Теперь тестируем его на странице, которая использует inlineformset_factory.
views.py
class PostCreate(CreateView):
model = Post
form_class = PostCreateForm
def get_form(self, *args, **kwargs):
form = super().get_form(*args, **kwargs) # Get the form as usual
user = self.request.user
form.fields['associated_portfolios'].queryset = Portfolio.objects.filter(user=user)
return form