2015-10-16 4 views
1

У меня есть ModelForm:Добавить ссылку на ModelAdmin

class SomeModelForm(forms.ModelForm): 
    class Meta: 
     model = SomeModel 

    def __init__(self, *args, **kwargs): 
     super(ApiBackendConfigForm, self).__init__(*args, **kwargs) 
     if kwargs['instance'].name == u'Some_name': 
      self.fields['method_config'] = forms.URLField() 

и ModelAdmin:

class SomeAdmin(admin.ModelAdmin): 
    form = SomeModelForm 
    list_display = ('name', 'alias', 'is_enabled',) 
    list_editable = ('is_enabled',) 
    readonly_fields = ('name', 'alias',) 

Первый вопрос, не отображается method_config поле. Я знаю, что это не в list_display, но если я добавлю его в list_display, это приведет к ошибке.

И второй главный вопрос: как я могу добавить ссылку на другие ModelAdmin?

+0

Я не думаю, что вы показываете достаточно информации. Что вы ожидаете от отображения 'method_config', когда вы добавляете его в' list_display'. Где вы хотите отобразить ссылку и на что именно вы хотите установить ссылку? – Alasdair

+0

@Alasdair, 'method_config' должен отображать ссылку на новый ModelAdmin, который еще не написан. – rva4

+0

в зависимости от object.name – rva4

ответ

0

Модификация self.fields не может быть потокобезопасной. Это означает, что если вы измените self.fields по первому запросу, все остальные запросы получат эту модифицированную версию.

Проверка ModelAdmin.get_fields(request, obj=None) Способ изменения полей для отображения на лету. Работает над формами в режиме просмотра. Если вы хотите отобразить настраиваемое поле в списке изменений, просто измените имя метода list_display с именем вместо поля.

Например:

class SomeAdmin(admin.ModelAdmin): 
    list_display = ('name', 'alias', 'is_enabled', 'show_method_config',) 
    list_editable = ('is_enabled',) 
    readonly_fields = ('name', 'alias',) 

    def show_method_config(self,obj): 
     return getattr(obj,"method_config","") if obj.name == u"Some_name" else "" 
    show_method_config.short_description = _(u"Method config") 
    show_method_config.admin_order_field = "method_config" 
    show_method_config.allow_tags = True 

    def get_fields(self, request, obj=None): 
     fields = super(SomeAdmin, self).get_fields(request, obj) 
     if obj and obj.name == u"Some_name": 
      fields.append("method_config") 
     return fields 
+0

'method_config' не является полем модели – rva4

+0

ничего не отображает – rva4

+0

Если вы хотите создать URL-адрес для определенного вида модели, попробуйте' from django.core.urlresolvers import reverse'' reverse ("admin: {{app_label}} _ {{model_name}} _ add ")' Проверьте [Django admin docs] (https://docs.djangoproject.com/en/1.8/ref/contrib/admin/#reversing-admin-urls) для всех доступных маршрутов. – pista329

Смежные вопросы