2013-08-23 2 views
0

Администратор Django позволяет вам легко создавать форму для редактирования модели и ее внешних ключей, но если я использую ModelForm в своем собственном представлении, у меня возникают проблемы с этим. Вот пример в admin.py:Как я могу получить эквивалент встроенных админов django в modelform?

class VendorPhotoInline(admin.StackedInline): 
    model = VendorPhoto 
    extra = 3 

class VendorAdmin(admin.ModelAdmin): 
    inlines = [VendorPhotoInline] 

admin.site.register(Vendor, VendorAdmin) 

Так что теперь в админке, я могу создать Vendor и добавить кучу фотографий. Однако для сотрудников, не являющихся сотрудниками, у меня есть форма для создания поставщика, и я бы хотел, чтобы они загружали некоторые фотографии, такие как admin.

Я использую ModelForm, который позволяет пользователям создавать новые Продавцов, но, конечно, они не могут добавлять фотографии в этот момент:

class VendorForm(ModelForm): 
    class Meta: 
     model = Vendor 

Как я могу достичь паритета с интерфейсом администратора здесь? Я бы согласился на решение, которое просто работает для новых экземпляров Vendor и позволяет загружать до определенного номера (скажем, 3), но что-то, что работает для существующих экземпляров и позволяет добавлять/удалять фотографии, тоже будет здорово. Спасибо за любую помощь!

+0

Использование [django-dynamic-formset] (https://github.com/elo80ka/django-dynamic-formset) – surfer190

ответ

2

Вы можете использовать inline formsets. Из документации:

Предположим, у вас есть эти две модели:

from django.db import models 

class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    author = models.ForeignKey(Author) 
    title = models.CharField(max_length=100) 

Если вы хотите создать formset, который позволяет редактировать книги , принадлежащие к определенному автору, вы можете сделать это:

>>> from django.forms.models import inlineformset_factory 
>>> BookFormSet = inlineformset_factory(Author, Book) 
>>> author = Author.objects.get(name=u'Mike Royko') 
>>> formset = BookFormSet(instance=author) 

inlineformset_factory заботится о вещах за кулисами, но для передней части вы можете найти полезное значение django-dynamic-formset jQuery plugin.

+0

Спасибо, я видел это в документации, хотя он просто создает набор форм для книг. Мне, вероятно, просто не хватает хорошего понимания форм Django, но я не знаю, как создать форму для нового автора в том же представлении и шаблоне

и иметь новые встроенные книги, связанные с созданным автором. Я хочу, чтобы view/template делал то, что сделает URL/add для администратора моего примера, что позволит создать новый Vendor и некоторые связанные VendorPhotos в одном . – mrooney

+0

@mrooney, я думаю, что единственное прозрение, которое вам не хватает, это то, что вы можете иметь несколько форм Django в одном HTML ''. Вы передаете шаблон «ModelForm» для родительской модели и набора форм в шаблон, а затем обрабатываете их в представлении. –

+0

Спасибо, это здорово. Я нашел http://collingrady.wordpress.com/2008/02/18/editing-multiple-objects-in-django-with-newforms/, который имеет некоторый полезный код просмотра, а также демонстрирует, как проверять все формы перед сохранением родительского пример. – mrooney

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