Как добавить прокручивающийся div непосредственно в ModelForm в Django?

#python #django #forms #html #scroll

#python #django #формы #HTML #прокрутка

Вопрос:

У меня есть следующий код, но он нигде не помещает прокрутку div. Все другие комбинации, которые я пробовал (например, размещение div вокруг таблицы), приводят к тому или иному неправильному размещению полос прокрутки. Это html:

 <form action="" method="post">
  <table>
    <div style="overflow: auto; width : 200px; height : 50px;">
      {{ form }}
    </div>
    <tr><td colspan="2"><input type="submit" value="Save"/></td></tr>
  </table>
</form>
  

Мои формы выглядят следующим образом:

 class GroupForm(forms.ModelForm):
    class Meta:
        model = Group

    def __init__(self, *args, **kwargs):
        super(GroupForm, self).__init__(*args, **kwargs)

        self.fields['permissions'].widget = forms.CheckboxSelectMultiple()
        self.fields['permissions'].choices = ((p.id, p.name) for p in Permission.objects.order_by("name"))
  

Мой views.py выглядит так:

 def group_edit(request, group_id, template_name="group_edit.html", extra_context=None, form_class=None):

    edit_group = get_object_or_404(Group, pk=group_id)
    extra_context = extra_context or {}
    form_class = form_class or GroupForm
    extra_context["edit_group"] = edit_group

    if request.method == "POST":
        form  = form_class(instance=edit_group, data=request.POST)
        if form.is_valid():
            form.save()
            return redirect(reverse("global_group_list"))
    else:
        form = form_class(instance=edit_group)

    extra_context["form"] = form

    return direct_to_template(
        request,
        template_name,
        extra_context=extra_context
    )
  

Ответ №1:

Поместите DIV внутри строки таблицы следующим образом

 <form action="" method="post">
  <table>
    <tr><td><div style="overflow: auto; width : 200px; height : 50px;">
      {{ form.as_p }}
    </div></td></tr>
    <tr><td colspan="2"><input type="submit" value="Save"/></td></tr>
  </table>
</form>
  

Комментарии:

1. Хорошо, я это сделал, хотя проблем быть не должно, но это не решает мою проблему. Это просто добавляет дополнительную строку в мою таблицу и вставляет туда пустой div. На самом деле это не инкапсулирует {{ форму }}.

2. Если DIV находится внутри таблицы, он должен быть в строке. Смотрите обновление.

3. это не сработало бы, в django {{form}} выводит <tr><td> .. для каждого поля. Вы могли бы попробовать это решение в сочетании с {{form.as_ul}}

4. Если это не сработает, можете ли вы показать мне функцию, которая выводит форму.

5. @JamesO, спасибо за это. Я не знал, что form является псевдонимом form.as_table

Ответ №2:

На самом деле это не проблема django, поэтому опубликованный вами код python действительно не имеет значения. Я думаю, проблема в том, что вы хотите, чтобы в таблице были полосы прокрутки, но кнопка отправки оставалась отдельной?

У вас есть два немедленных варианта. вы можете обернуть {{ form }} во вторую таблицу, чтобы у вас было две вложенные таблицы. В качестве альтернативы вы можете переместить div и кнопку отправки так, чтобы они находились за пределами вашей таблицы, чтобы таблица была обернута div.

В любом случае то, что у вас есть сейчас, не будет работать. любой непосредственный дочерний тег тега таблицы, отличный от tbody или tr, будет проигнорирован.