Поле фильтрации в форме 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 для решения этой проблемы, но не уверен, как. Любая помощь или понимание будут приняты с благодарностью.