我创建了一个简单的图书应用程序,有三个模型,book、Author、Genre。一切都很好,现在我想为这一类型创建一个Select Field。选择字段的内容应该是来自现有类型的查询集。选择字段应该在模板中,当我选择一个流派并单击搜索按钮时,它应该列出流派及其书籍。由于我没有意识到我需要你的帮助如下:
- 我必须在哪里生成Select字段?我可以实现它吗
- 在视图中我要做什么.py
以下是我迄今为止在forms.py:中所做的工作
class GenreSelectForm(forms.Form):
categories = forms.ModelChoiceField(queryset=Genre.objects.all())
此外,我创建了一个模板(genre_select.html(,如下所示:
{% block content %}
<h4>Searching</h4>
<form action="" method="GET"></form>
{{ form.as_p }}
<button type="submit">Search</button>
{% endblock %}
然而,我不知道这是否是正确的方式以及如何实现它这是我的型号.py
from django.db import models
class Genre(models.Model):
name = models.CharField(max_length=25)
def __str__(self):
return self.name
@property
def get_books(self):
return Book.objects.filter(genre__name=self.name)
class Author(models.Model):
name = models.CharField(max_length=128)
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=128)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
genre = models.ForeignKey(Genre, on_delete=models.CASCADE)
isbn = models.CharField(max_length=10)
price = models.DecimalField(max_digits=7, decimal_places=2)
date_published = models.DateField()
def __str__(self):
return self.title
您可以从等视图发送模板中的所有流派
def your_view(request):
if request.method == 'GET':
genres = Genre.objects.all()
context = {'genres ' : genres }
return render(request,'genre_select.html',context)
else: #post method
genres = Genre.objects.all()
genre = request.POST.get('name_of_your_select_tag')
books = Book.objects.filter(genre=genre)
context = {
'genres ' : genres,
'books' : books,
}
return render(request,'genre_select.html',context)
您可以在渲染genre_select.html
模板的视图中编写上述代码。在你的模板中,你可以写这样的
{% block content %}
<h4>Searching</h4>
<form action="" method="GET"></form>
<select>
{% for genre in genres %}
<option value="{{genre.id}}"> {{genre.name}} </option>
{% endfor %}
</select>
<button type="submit">Search</button>
{% endblock %}
在你看来,你可以获得genre_id
并展示与该类型相匹配的书籍。通过上述方法,您不需要在forms.py
中包含流派字段