2015-02-28 18 views
5

Próbuję rozszerzyć szablon change_form.html jednego z moich modeli o niektóre informacje na stronie. Czytałem dokumentację django w https://docs.djangoproject.com/en/1.6/ref/contrib/admin/#overriding-vs-replacing-an-admin-templateProblemy z rozszerzeniem change_form.html w django admin

Problem polega na tym, że zachodzi:

NoReverseMatch w/contas_pagar/pagamento/2/ odwrotnej dla 'app_list' z argumentów '()' i hasła nie znaleziono argumentów "{u'app_label": ""} ". 1 wzór (y) próbował: [ '(? P \ w +)/$']

Używam Django 1.6.5 z Django-suit 0.2.12

Błąd obrazu: https://dl.dropboxusercontent.com/u/80415688/error_app_django.PNG

w my_project/my_app/templates/admin/my_app/my_model/change_form.html

{% extends "admin/change_form.html" %} 

w my_project/urls.py

urlpatterns = patterns('', 
    url(r'^contas_pagar/pagamento/(?P<id_parcela>\d+)/$', 
          'contas_pagar.views.retorna_pagamentos_parcela'), 
    # django urls 
    url(r'^doc/', include('django.contrib.admindocs.urls')), 
    url(r'', include(admin.site.urls)),) 

w my_project/views.py

def return_id(request, id): 
    data = { 'test': 'test', } 
    return render_to_response('admin/my_app/my_model/change_form.html', data, 
           context_instance=RequestContext(request)) 

Czy ktoś ma jakiś pomysł, jak rozwiązać?


UPDATE:
Zrobiłem kilka zmian w kodzie.
Widok jest w mojej klasie ModelAdmin.

w my_project/my_app/szablony/admin/my_app/my_model/change_form.html:

{% extends "admin/change_form.html" %} 
{% block after_field_sets %}{{ block.super }} 
    <h2>{{ test }}</h2> 
{% endblock %} 

w my_project/my_app/admin.py:

class PagamentoAdmin(admin.ModelAdmin): 
form = PagamentoForm 
model = Pagamento 
list_display = ('id', 'parcelas_contas_pagar', 'data', 'valor') 

def get_urls(self): 
    urls = super(PagamentoAdmin, self).get_urls() 
    my_urls = patterns('', 
     (r'(?P<id_parcela>\d+)/$', self.admin_site.admin_view(self.retorna_pagamentos_parcela)), 
    ) 
    return my_urls + urls 

def retorna_pagamentos_parcela(self, request, id_parcela): 
    data = { 
     'test': test, 
     'opts': self.model._meta, 
     'app_label': self.model._meta.app_label, 
     'change': True, 
     'add': False, 
     'is_popup': False, 
     'save_as': False, 
     'has_delete_permission': False, 
     'has_add_permission': False, 
     'has_change_permission': True 
    } 
    return render_to_response('admin/contas_pagar/pagamento/change_form.html', data, context_instance=RequestContext(request)) 

nie pojawiają się więcej błędów. Po prostu nie wyświetla się pól mojej klasy Admin.

Odpowiedz

9

change_form.html zawiera następujący tag url:

{% url 'admin:app_list' app_label=opts.app_label %} 

Więc należy przekazać zmienną opts do kontekstu szablonu:

data = {'test': 'test', 
     'opts': MyModel._meta} 

UPDATE: Szablon change_form.html używa znacznika {% submit_row %} szablonu, który wymaga innych zmiennych kontekstowych, więc słownik data powinien wyglądać tak:

data = {'test': 'test', 
     'opts': MyModel._meta,  
     'change': True, 
     'is_popup': False, 
     'save_as': False, 
     'has_delete_permission': False, 
     'has_add_permission': False, 
     'has_change_permission': False} 
+0

Witaj przyjacielu, dziękuję za odpowiedź. Dokonałem zmiany w moim pliku view.py. Spędził Esso błąd ... Ale potem był kolejny błąd ... zobaczyć [link] (https://dl.dropboxusercontent.com/u/80415688/error_change_django.PNG) nie mogłem znaleźć niczego o tym. Czy masz pomysł na ten błąd? –

+0

Niesamowita @catavaran, To był problem, trzeba było przekazać pewne zmienne, jest więcej do kontekstu :) Ale jeśli możesz mi pomóc z jednym ostatnim pytaniem ... Próbowałem zrobić po twojej odpowiedzi i ja nie udało się ... Pola mojego formularza nie zostały wyświetlone wraz z moimi dostosowaniami. Po prostu się nie pojawiają. Czy muszę podać trochę więcej zmiennych w kontekście? rozszerzyć niektóre metody ModelAdmin? –

+0

Pokaż swój widok i szablon. – catavaran

2

Jest to spowodowane najprawdopodobniej dlatego, że masz znacznik {% url %} próbujący utworzyć łącze do listy app_list. Może to być w twoim admin/form_change.html lub w innym dołączonym/rozszerzonym szablonie.

To zwykle spowodowane kontekście, że nie przechodzi prawidłowo, takich jak jeśli masz tag, który wygląda jak {% url 'app_list' %} lub {% url 'app_list' var %} i var jest pusty.

+0

Dzięki za odpowiedź, przyjacielu. Brak przeniesienia do zmiennej kontekstu opt. Ale nadal pokazuje błąd w odpowiedzi udzielonej @catavaran. Czy masz pojęcie, co może być? –