отправить форму в модель django-admin с фильтром

Я хотел бы иметь настраиваемый фрагмент кода формы html, который позволяет пользователю выбрать «обучение», которое затем используется в качестве параметра запроса для фильтра модели django-admin для «участников».

Я успешно создал фильтр на modeladmin:

class ParticipantAdmin(RestrictedModelAdmin):
    list_filter = ('training__name',)

Вероятно, стоит отметить, что RestrictedModleAdmin является подклассом ModelAdmin, который обеспечивает безопасность на уровне строк для модели; вошедшие в систему пользователи должны видеть только те строки, которые им принадлежат.

Таким образом, URL-адреса, использующие этот фильтр, при использовании этого интерфейса администратора выглядят примерно так:

/admin/core/participant/?training__name=Menno+Ropes

Все это прекрасно работает. Теперь я думаю, что смогу создать очень простую форму, которая позволит выбрать действительное «обучение» и отправить его / admin / core / members / как GET.

<form method="GET" action="/admin/core/participant/">{% csrf_token %}
    <ol>
        <li>Select your training:
            <select name='training__name'>
                <option value=''>&mdash;</option>
                {% for training in trainings %}
                <option value='{{ training.name }}'>{{ training }}</option>
                {% endfor %}
            </select>
        </li>
        <li>See participants for that training.
            <input type='submit' name='submit' value='Submit' /></li>
    </ol>
</form>

Этот последний бит не работает. Некоторая магия foo во внутренностях django, кажется, всегда искажает представление:

/admin/core/participant/?e=1

Очевидно, что это не выбирает подходящее значение фильтра и, таким образом, показывает нефильтрованный список «участников».

Что происходит? Что я могу сделать, чтобы разрешить передачу моего параметра GET модели администратора?

Заранее спасибо.

PS) Django 1.3+


person portman    schedule 20.04.2011    source источник


Ответы (2)


Проблема в том, что у вас есть атрибут name в вашем <input type="submit">, вызывающий дополнительный параметр GET: submit, который выдает неверную ошибку поиска и, следовательно, e=1

Удалите атрибут name, и все готово.

Я провел небольшой эксперимент, чтобы подтвердить это, так как мне показалось странным, что сервер может каким-то образом по-другому относиться к GET браузера.

person Yuji 'Tomita' Tomita    schedule 20.04.2011
comment
Да, Django ограничивает параметры фильтра тем, что вы определили как фильтры, и не принимает произвольные параметры. Таким образом, люди не могут бросать запросы к списку, который не был явно определен как доступный. - person Danny W. Adair; 20.04.2011
comment
Отлично! Помимо удаления атрибута имени кнопки отправки, мне также пришлось удалить тег django {% csrf_token%} из исходного фрагмента html. Спасибо @ yuji-tomita - person portman; 21.04.2011
comment
@portman - если этот ответ помог вам решить проблему, вы должны поставить галочку рядом с ответом. - person Yuji 'Tomita' Tomita; 21.04.2011

Это немного сложно, но у меня работает:

def changelist_view(self, request, bill_id, extra_context=None):
    """queryset is an extra parameter"""
    req = request.GET.copy()
    if 'queryset' in req:
        queryset = req.pop('queryset')[0]
    else:
        queryset = request.META['HTTP_REFERER'].split('queryset=')[1]
        url = "/admin/billing/invoice/%s/select_to_move/?%s&queryset=%s" % (bill_id, request.GET.urlencode(), queryset)
        return HttpResponseRedirect(url)  
    request.GET = req
    # Do stuff with queryset.
    return super(MyAdminClass, self).changelist_view(request, context)    
person glic3rinu    schedule 03.07.2011