Администратор Django изменяет вывод to_python на основании запроса - PullRequest
0 голосов
/ 15 февраля 2012

Мне интересно, как изменить поведение поля формы на основе данных в запросе ... особенно в том, что касается администратора Django.Например, я хотел бы расшифровать поле в администраторе на основе данных запроса (таких как POST или переменные сеанса).

Я думаю начать с переопределения метода change_view в django / contrib / admin / options.py, так как он имеет доступ к запросу.Однако я не уверен, как повлиять на то, как значение поля отображает поле в зависимости от некоторого значения в запросе.Если запрос имеет правильное значение, значение поля будет отображаться;в противном случае значение поля будет возвращать что-то вроде «NA».

Я думаю, что если бы я мог каким-то образом получить это значение запроса в метод to_python (), я мог бы напрямую повлиять на отображение поля.Стоит ли пытаться передать значение запроса в форму init , а затем как-нибудь в поле init ?Любые предложения, как я мог бы подойти к этому?

Спасибо за чтение.

В models.py

class MyModel(models.Model):
    hidden_data = models.CharField()

В admin.py

class MyModelAdmin(models.ModelAdmin):
    class Meta: 
        model = MyModel

def change_view(self, request, object_id, extra_context=None):
    .... # Perhaps this is where I'd do a lot of overriding? 
    ....
    return self.render_change_form(request, context, change=True, obj=obj)

1 Ответ

1 голос
/ 15 февраля 2012

Я не проверял это, но вы могли бы просто переписать render_change_form метод ModelAdmin, чтобы прокрасться в вашем коде, чтобы изменить значение поля между временем обработки change_view и фактическим отображенным шаблоном * 1004. *

class MyModelAdmin(admin.ModelAdmin):
    ...
    def render_change_form(self, request, context, **kwargs):
        # Here we have access to the request, the object being displayed and the context which contains the form
        form = content['adminform'].form
        field = form.fields['field_name']
        ...
        if 'obj' in kwargs:
            # Existing obj is being saved
        else:
            # New object is being created (an empty form)
        return super(MyModelAdmin).render_change_form(request, context, **kwargs)
...