如何在Django中使用循环创建表单?

时间:2018-08-10 16:09:45

标签: python django django-forms django-class-based-views django-filters

我必须做硬形式。带过滤器。 我是用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)

请帮帮我...

0 个答案:

没有答案