Вручную отрисованная Django проблема перенаправления набора форм в подчинении - PullRequest
0 голосов
/ 10 января 2020

У меня определены следующие модели:

class Item(models.Model):
    rfid_tag    = models.CharField()
    asset       = models.OneToOneField('Assets', default=None, null=True,
                                       on_delete=models.SET_DEFAULT,)
    date        = models.DateTimeField(name='timestamp',                     
                                       auto_now_add=True,)
...

class Assets(models.Model):
    id = models.AutoField(db_column='Id', primary_key=True)
    assettag = models.CharField(db_column='AssetTag', unique=True, max_length=10)
    assettype = models.CharField(db_column='AssetType', max_length=150)
...

    class Meta:
        managed = False
        db_table = 'Assets'
        ordering = ['assettag']

    def __str__(self):
        return f"{self.assettag}"

    def __unicode__(self):
        return f"{self.assettag}"

Для которых я создал следующую форму и набор форм:

class ItemDeleteForm(forms.ModelForm):

    asset = forms.CharField(required=True,
                            help_text= "Item asset tag",
                            max_length=16,
                            label="AssetTag",
                            disabled=True,
                            )

    delete = forms.BooleanField(required=False,
                                label="Delete",
                                help_text='Check this box to delete the corresponding item',
                                )

    class Meta:
        model = Item
        fields = ['asset']

ItemDeleteMultiple = forms.modelformset_factory(model=Item,
                                         form=ItemDeleteForm,
                                         extra=0,
                                         )

, управляемый представлением:

class DeleteMultipleView(generic.FormView):
    template_name = '*some html file*'
    form_class = ItemDeleteMultiple
    success_url = reverse_lazy('*app_name:url_name*')

    def form_valid(self, form):
        return super().form_valid(form)

И отображается в шаблоне:

{% extends "pages/base.html" %}

{% block title %}
    <title>Delete Multiple</title>
{% endblock %}

{% block content %}
    <h1>Delete Multiple Items</h1>
<br>
    <form class="ManualForm" action ="." method="POST"> {% csrf_token %}
        {{ form.management_form }}
        <table border="2">
            <tr><th colspan="3" scope="row">Select Items to Delete</th></tr>
            {% for item_form in form %}
            <tr>
                <td><label for="{{ item_form.asset.id_for_label }}">AssetTag {{forloop.counter}}:</label>
                    {% if item_form.non_field_errors %}
                        {{ item_form.non_field_errors }}
                    {% endif %}
                    {% if item_form.asset.errors %}
                        {{item_form.asset.errors}}
                    {% endif %}
                </td>
                <td>{{item_form.asset}}</td>
                <td>{{item_form.delete}}
                    {% if item_form.delete.errors %}
                        {{item_form.delete.errors}}
                    {% endif %}
                </td>
            </tr>
            {% endfor %}
        </table>
        <br>
        <input class = "btn btn-success" type="submit" value="Delete Selected" />
        <a href="{% url 'inventory:index' %}" class="btn btn-secondary">Cancel</a>
    </form>

<form class="AutoForm" action ="." method="POST"> {% csrf_token %}
    {{form.as_table}}
    <input class = "btn btn-success" type="submit" value="Delete Selected" />
    <a href="{% url 'inventory:index' %}" class="btn btn-secondary">Cancel</a>
</form>

{% endblock %}

Когда я отправляю автоформу, все отлично. Это приводит меня к app_name:url_name, но если я выберу ManualForm, я не перенаправлюсь. Он просто очистит все данные и перезагрузит страницу формы с пустыми полями.

Код состояния ответа HTTP POST для AutoForm - 302, а для ManualForm - 200.

Я не понимаю, как шаблон может влиять на поведение перенаправления URL. Что я делаю не так в ручном рендеринге formset?

1 Ответ

0 голосов
/ 13 января 2020

Похоже, что добавление:

{% for field in item_form.hidden_fields %}
    {{field}}
{% endfor %}

под {% for item_form in form %} решит проблему.

Я не очень хорошо понял из документов :

Цикл по скрытым и видимым полям

Если вы вручную размещаете форму в шаблоне, а не полагаетесь на макет формы по умолчанию в Django, вам может потребоваться обрабатывать поля иначе, чем не скрытые поля. Например, поскольку скрытые поля ничего не отображают, размещение сообщений об ошибках «рядом» с этим полем может вызвать замешательство у ваших пользователей - поэтому ошибки для этих полей следует обрабатывать по-разному.

Я просто подумал это из-за ошибок, поэтому мне было все равно. Но первое, что он говорит о формах, это:

Например, форма входа для администратора Django содержит несколько элементов : один из type = "text" для имя пользователя, один из type = "password" для пароля и один из type = "submit" для кнопки «Войти». Он также содержит некоторые скрытые текстовые поля, которые пользователь не видит, которые Django использует для определения того, что делать дальше.

Он также сообщает браузеру, что данные формы должны быть отправлены на URL, указанный в атрибут действия - / admin / - и его следует отправлять с использованием механизма HTTP, указанного в атрибуте метода - post.

Возможно, это поможет кому-то еще.

...