Django Queryset ManyToMany - PullRequest
       28

Django Queryset ManyToMany

0 голосов
/ 19 февраля 2020

Я пытаюсь показать пользователю портфель 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...