Django Admin - пользовательский столбец в первой строке не отображается должным образом - PullRequest
0 голосов
/ 27 сентября 2019

Мы столкнулись со странной проблемой.Существует модель Transaction, и у ее администратора есть пользовательский столбец revert, который отправляет POST на сервер.

Странно то, что revert в первой строке не работает.Я просто не отображаю тег <form>.Другие строки работают правильно.

@admin.register(Transaction)
class TransactionAdmin(admin.ModelAdmin):
    list_display = ['code', 'created', 'modified', 'wallet', 'title', 'amount', 'invoice_link','revert']

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        self.request = request
        return qs

    def revert(self, obj: Transaction):
        if obj.pk:
            html = render_to_string("alex_wallets/transactions/revert_block.html", context={'transaction': obj},
                                    request=self.request)
            return mark_safe(format_html(html))

revert_block.html

<div>
    <form onsubmit="return confirm('Naozaj chcete vytvoriť opačnú transakciu?')"
          action="{% url "wallets:revert_transaction" transaction.pk %}" method="post">
        {% csrf_token %}
        <button style=" color: #fff; background-color: #00D996; border: 0; border-radius:4px; cursor: pointer; padding: 5px 10px;" type="submit">Vrátiť
        </button>
    </form>
</div>

Это html первой строки (возврат столбца):

<td class="field-revert"><div>

        <input type="hidden" name="csrfmiddlewaretoken" value="agpE7aEExG19YJ3n8wDv88sC7J7u7aHXa5Od3vVJptA6t0on1gGENECaTt2Qp7hb">
        <button style=" color: #fff; background-color: #00D996; border: 0; border-radius:4px; cursor: pointer; padding: 5px 10px;" type="submit">Vrátiť
        </button>

</div></td>

И это html отличного от первого столбца возврата строки:

<td class="field-revert"><div>
    <form onsubmit="return confirm('Naozaj chcete vytvoriť opačnú transakciu?')" action="/alex/transakcie/transactions/revert/45/" method="post">
        <input type="hidden" name="csrfmiddlewaretoken" value="Pc7Pt41tXgMUyZyKOORUb2gQutkqCkjpP1woppiyP3lR3gTKHyU3QyqogdfMUhTD">
        <button style=" color: #fff; background-color: #00D996; border: 0; border-radius:4px; cursor: pointer; padding: 5px 10px;" type="submit">Vrátiť
        </button>
    </form>
</div></td>

То же самое относится к форме inline.

Знаете ли вы, в чем проблема?

РЕДАКТИРОВАТЬ:

Это всегда первый ряд.Я могу изменить порядок строк, и всегда это первый, который не отображается должным образом.И я проверил это в django-jet и встроил в raw django-admin тоже.У обоих есть эта проблема.

EDIT2:

В отладчике я вижу, что html всегда отображается правильно, даже для первой строки.

EDIT3:

Это не зависит от браузера.То же самое происходит на Chrome и Firefox

EDIT4:

Так что я ближе к корню.Я заметил, что он отображается правильно, но браузер удаляет первую форму.Вероятно, потому, что таблица changelist по умолчанию окружена другой формой, но не знает, что делать.

1 Ответ

0 голосов
/ 27 сентября 2019

Таким образом, проблема заключалась в том, что существует большое значение по умолчанию form, окружающее всю таблицу changelist, и браузеры не любят вложенные формы.Поэтому нам нужно было сделать это по-другому.

Итак, я создал код js, который динамически создает новую форму при необходимости.

отменить шаблон

<div>

    <button class="postbtn" data-csrf="{{ csrf_token }}"
            data-action="{% url "wallets:revert_transaction" transaction.pk %}"
            style=" color: #fff; background-color: #00D996; border: 0; border-radius:4px; cursor: pointer; padding: 5px 10px;"
            type="button">Vrátiť
    </button>
</div>

, тогда я создал buttonpost.js

function nonAjaxPost(action, input) {
    'use strict';
    var form;
    form = jQuery('<form />', {
        action: action,
        method: 'post',
        style: 'display: none;'
    });
    if (typeof input !== 'undefined' && input !== null) {
        jQuery.each(input, function (name, value) {
            jQuery('<input />', {
                type: 'hidden',
                name: name,
                value: value
            }).appendTo(form);
        });
    }
    form.appendTo('body').submit();
}

jQuery(document).ready(function () {
    jQuery('button[class="postbtn"]').click(function () {
        if (confirm("Potvrďte vrátenie transakcie")) {
            var ths = jQuery(this);
            var url = ths.attr('data-action');
            var csrf = ths.attr('data-csrf');

            nonAjaxPost(url, {'csrfmiddlewaretoken': csrf});
        }
    })
});

, который может бытьвключается с использованием class Media:

class ....Admin(..):
    class Media:
        js = ['...buttonpost.js']

Точно так же, как оно может быть включено в AdminInline

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...