Как сделать так, чтобы в выпадающем списке формы django отображались элементы, созданные только автором, а не всеми пользователями?
Я создал две модели тем и записей. Пользователь может создать тему, а также создать записи для каждой созданной им темы.
В классе создания темы в поле "тема" отображаются все темы, созданные всеми пользователями в выпадающем меню формы.
Однако я просто хочу, чтобы в раскрывающемся списке формы отображались темы, созданные только автором, чтобы пользователь мог создавать записи только для своей темы, но не для других тем. Как это сделать?
models.py:
class Topic(models.Model):
'''A topic that user will add the content about.'''
title = models.CharField(max_length=200, unique=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
class Entries(models.Model):
'''Entries and Topic will have many to one relationship'''
topic = models.ForeignKey(Topic, on_delete=models.CASCADE)
name = models.CharField(max_length=100)
text = models.TextField()
entries_image = models.ImageField(default= 'default.jpg', upload_to ='images')
date_added = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(User, on_delete=models.CASCADE)
views.py
class CreateTopic(LoginRequiredMixin, CreateView):
model = Topic
fields = ['title']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
class CreateTopicEntry(LoginRequiredMixin, CreateView):
model = Entries
fields = ['topic', 'name','text','entries_image']
def form_valid(self, form):
form.instance.author = self.request.user
return super().form_valid(form)
Topic_form.html:
<div>
<form method="POST">
{% csrf_token %}
{% if object %}
<h4 class="mb-4">Update your Topic 👇</h4>
{{ form|crispy }}
{% else %}
<h4 class="mb-4">Create your new Topic 👇</h4>
{{ form|crispy }}
{% endif %}
<div class="form-group">
<button class="btn btn-light" type="submit">Submit</button>
</div>
</form>
</div>
entries_form.html:
<div class="mt-5">
<form method="POST" enctype="multipart/form-data">
{% csrf_token %}
{% if object %}
<h4 class="mb-4">Update your Entry 👇</h4>
{{ form|crispy }}
{% else %}
<h4 class="mb-4">Create your new Entry 👇</h4>
{{ form|crispy }}
{% endif %}
<div class="form-group">
<button class="btn btn-light" type="submit">Submit</button>
</div>
</form>
</div>
Вам просто нужно переопределить набор запросов формы в методе CreateTopicEntry
's get_form
, вот так:
class CreateTopicEntry(LoginRequiredMixin, CreateView):
# Keep the code you already have
# ...
def get_form(self, *args, **kwargs):
form = super().get_form(*args, **kwargs)
# Filter the queryset to include only topics by current user
form.fields['topic'].queryset = Topic.objects.filter(author=self.request.user)
return form