Поле фильтрации в форме django

Я создаю веб-сайт с помощью django. Этот сайт основан на пользователях, и у каждого пользователя есть модель профиля. Сейчас я работаю над созданием системы, в которой каждый пользователь может ввести свой опыт работы. Я хочу, чтобы вы могли ввести категорию, а затем заполнить баллы для каждой категории. (Например, если вы писали для New York Times, категория будет "New York Times", а затем прямо под ней будут статьи, которые вы написали, в виде пунктов).

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

models.py

from django.db import models
from django.contrib.auth.models import User

class Category(models.Model):
    user = models.ForeignKey(User, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='cat')
    name = models.CharField(max_length=100)
    date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True)
    

    def __str__(self):
        return self.name

class Work(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True)
    name = models.CharField(max_length=100)
    link = models.URLField(max_length=200, blank=True, default='') 
    date = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True)
    category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, null=True, blank=True)
    
    def __str__(self):
        return self.name

views.py

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView
from django.apps import apps
Post = apps.get_model('blog', 'Post')
Work = apps.get_model('users', 'Work')

class CreateCategory(LoginRequiredMixin, CreateView):
    model = Category
    fields = ['name', 'date']
    success_url = reverse_lazy('resumebuilder')

    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(CreateCategory, self).form_valid(form)


class CreateWork(LoginRequiredMixin, CreateView):
    model = Work
    fields = ['name', 'link', 'date', 'category']
    success_url = reverse_lazy('resumebuilder')


    def form_valid(self, form):
        form.instance.user = self.request.user
        return super(CreateWork, self).form_valid(form)

category_form.html

{% extends "blog/base.html" %}
{% block content %}


<h1> Category Form </h1>

<div>
    <form method="POST" action="">
        {% csrf_token %}
            {{form.as_p}}
        <input class="button" type="submit" value="Submit">
    </form>
</div>



{% endblock content %}

work_form.html

{% extends "blog/base.html" %}
{% block content %}


<h1> Work Form </h1>

<div>
    <form method="POST" action="">
        {% csrf_token %}
            {{form.as_p}}
        <input class="button" type="submit" value="Submit">
    </form>
</div>



{% endblock content %}

В представлении CreateWork вы можете увидеть, что fields = ['name', 'link', 'date', 'category']. Это поле 'category' является тем, которое нужно отфильтровать. Я хочу бросить туда что-то вроде этой строки:

Sorted_categories = Category.objects.filter(user=self.request.user)

Я также полагаю, что могу использовать get_context_data для решения этой проблемы, но не уверен, как. Любая помощь или понимание будут приняты с благодарностью.

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