Django-Admin: интеграция пользовательских форм - PullRequest
3 голосов
/ 25 октября 2011

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

Что я делаю не так? Нужно ли создавать свой собственный шаблон или я могу как-то повторно использовать существующий файл admin / change_form.html, и я просто не получаю его?

Traceback

Строка 60 выделена.

Template error:
In template site-packages\django\contrib\admin\templates\admin\change_form.html,
    error at line 60
Caught KeyError while rendering: 'opts'
50 : {% endfor %}
51 : 
52 : {% block after_field_sets %}{% endblock %}
53 : 
54 : {% for inline_admin_formset in inline_admin_formsets %}
55 :     {% include inline_admin_formset.opts.template %}
56 : {% endfor %}
57 : 
58 : {% block after_related_objects %}{% endblock %}
59 : 
60 :  {% submit_row %}
61 : 
62 : {% if adminform and add %}
63 :    <script type="text/javascript">document.getElementById("{{ adminform.first_field.id_for_label }}").focus();</script>
64 : {% endif %}
65 : 
66 : {# JavaScript for prepopulated fields #}
67 : {% prepopulated_fields_js %}
68 : 
69 : </div>
70 : </form></div>

views.py

def import_tags(request):
    if request.method == "POST":
        form = RfidImport(request.POST, request.FILES)
        if form.is_valid():
            form.save()
            success = True
            context = {"form": form, "success": success}
            return HttpResponseRedirect("../")
    else:
        form = RfidImport()
        context = {"form": form}
        return render_to_response("admin/change_form.html", context,
            RequestContext(request))

forms.py

class RfidImport(forms.ModelForm):
    file_to_import = forms.FileField()

    class Meta:
        model = RfidTag
        fields = ("file_to_import", )

    def save(self, commit=False, *args, **kwargs):
        form_input = RfidImport()
        file_csv = self.cleaned_data['file_to_import']
        csv.register_dialect('excel-new', delimiter=';', quoting=csv.QUOTE_NONE)
        records = csv.reader(file_csv, dialect='excel-new')
        for line in records:
            self.system = line[0]
            self.tagId = line[1]
            self.serial = line[2]
        form_input.save()
    datafile.close()

admin.py

class RfidTagAdmin(admin.ModelAdmin):
    list_display = ('tagId','serial', 'system', 'user')

    def get_urls(self):
        urls = super(RfidTagAdmin, self).get_urls()
        my_urls = patterns('',
            (r'^import/$', self.admin_site.admin_view(import_tags))
        )
        return my_urls + urls

    pass

admin.site.register(RfidTag, RfidTagAdmin)

Ответы [ 3 ]

5 голосов
/ 25 октября 2011

Вам определенно нужно использовать свой собственный шаблон или изменить форму изменения, но также изменить вид изменения. Например, добавить этот импорт в саму форму изменения должно быть тривиально.

Администратор Django использует множество волшебных вещей для своего администратора, и у этих шаблонов есть много тегов, которые являются специфическими для объектов, передаваемых через его представления change / changelist.

Расширьте admin/base_site.html вместо этого, и все готово.

1 голос
/ 25 октября 2011

вам нужно передать в контекст представления еще две переменные:

context['opts'] = RfigTag._meta
context['app_label'] = RfigTag._meta.app_label
0 голосов
/ 31 июля 2013

Может быть, вам просто нужно сделать:

class RfidTagAdmin(admin.ModelAdmin):
      form = RfidImport
      ...

См .: https://docs.djangoproject.com/en/1.5/ref/contrib/admin/#django.contrib.admin.ModelAdmin.form

...