我必须做硬形式。带过滤器。 我是用html完成的,但是为了保存表单字段中的数据并让代码看起来更好,我必须在Django表单中进行操作。 我的模特:
class TagsEpisodes(models.Model):
tag_type = models.ForeignKey('TagsTypes', models.DO_NOTHING)
tag_id = models.AutoField(primary_key=True)
episode = models.ForeignKey('Episodes', models.DO_NOTHING)
tag_value = models.CharField(max_length=30, blank=True, null=True)
class TagsTypes(models.Model):
tag_type_id = models.AutoField(primary_key=True)
tag_type = models.CharField(unique=True, max_length=50, blank=True, null=True)
我必须以标签类型编写表单,并为每个标签类型选择带有tag_value的选择。 screen, how it must to be: 我是如何用HTML编写的:
<form action="" method="get">
<div class="tag_select__block">
<input type="button" name="" class="delete_select_tag_type" value="Отменить все">
<div class="tag_episodes_tag_type">
{% for tag_type in tag_types %}
<div class="label_select_tag_value">
<label for="{{ tag_type.tag_type_id }}" class="tag_type_label">{{ tag_type.tag_type }}</label>
<select class="select_tag_value" name="{{ tag_type.tag_type_id }}" id="{{ tag_type.tag_type_id }}" multiple="multiple">
<option id="+" value='0'></option>
<option value='+'>+</option>
<option value='-'>-</option>
<option value='-/-'>-/-</option>
<option value='+/+'>+/+</option>
<option value='+/-'>+/-</option>
<option value='-/+'>-/+</option>
</select>
</div>
{% endfor %}
</div>
</div>
<input type='submit' value='Filter'/>
</form>
我在视图中处理了此表单:
class TagsEpisodesList(LoginRequiredMixin, PagedFilteredTableView, FormView):
model = TagsEpisodes
table_class = TagsEpisodesTable
filter_class = TagsEpisodesListFilter
formhelper_class = TagsEpisodesListFormHelper
form_class = TagsEpisodesForm
template_name = 'data_analysis/tags_episodes.html'
login_url = 'login/'
# Вывод всех tag_types (берется из другой модели (TagsTypes))
def get_context_data(self, **kwargs):
context = super(TagsEpisodesList, self).get_context_data()
qs = super(TagsEpisodesList, self).get_queryset()
context['tag_types'] = TagsTypes.objects.all()
context['error_tag_value'] = ''
context['tag_value_choiced'] = {}
tag_types = TagsTypes.objects.all()
for tag_type in tag_types:
if self.request.GET.get(str(tag_type.tag_type_id)):
tag_value_list = self.request.GET.getlist(str(tag_type.tag_type_id))
for tag_value in tag_value_list:
context['tag_value_choiced'][tag_type.tag_type_id] = tag_value
if not qs.filter(tag_type=tag_type, tag_value=tag_value):
context['error_tag_value'] = (str(tag_type.tag_type) + ' dont contain tag_value = ' + str(tag_value)) or context['error_tag_value']
return context
def get_queryset(self):
qs = super(TagsEpisodesList, self).get_queryset()
tag_types = TagsTypes.objects.all()
test_qs = TagsEpisodes.objects.none()
filter_episode_id = TagsEpisodes.objects.none()
num_tag_type = 0
# фильтрация сразу tag_type + tag_value, запрос ИЛИ
# есть возможность выбрать несколько tag_value
for tag_type in tag_types:
if self.request.GET.get(str(tag_type.tag_type_id)):
num_tag_type += 1
tag_value_list = self.request.GET.getlist(str(tag_type.tag_type_id))
for tag_value in tag_value_list:
test_qs = qs.filter(
tag_type_id=tag_type.tag_type_id,
tag_value=tag_value,
) | test_qs
# фильтрация по эпизоду(количество tag_type для одного эпизода и group by для повторяющихся)
for tag_type in tag_types:
if self.request.GET.get(str(tag_type.tag_type_id)):
filter_episode_id = test_qs.values("episode__episode_title").annotate(num_tag_type=Count('tag_type_id')).filter(num_tag_type=num_tag_type)
qs = filter_episode_id
break
self.filter = self.filter_class(self.request.GET, queryset=qs)
self.filter.form.helper = self.formhelper_class()
return self.filter.qs
和这里的问题。我如何用这种结构写表格: 我通过了所有tag_types的列表 并为每个tag_types加上一个tag_value选择字段?
我需要这样的形式:
class TagsEpisode(forms.Form):
tag_values = {"+", "-"}
for tag_type in TagsTypes.objects.all():
tag_type.tag_type_id = forms.ModelMultipleChoiceField(tag_values)
请帮帮我...