отправить форму в django-admin модель с фильтром - PullRequest
0 голосов
/ 20 апреля 2011

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

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

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

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

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

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

Все это прекрасно работает.Теперь я думаю, что смогу создать очень простую форму, которая позволит выбрать действительный «тренинг» и отправить его в / admin / core / member / в виде 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 +

Ответы [ 2 ]

2 голосов
/ 20 апреля 2011

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

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

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

0 голосов
/ 03 июля 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)    
...