Django - Admin: редактирование дочерней модели без inlineForm - PullRequest
4 голосов
/ 09 ноября 2011

Стандартный пример:

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

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

Я хочу отредактировать Book s со страницы изменения Author.
Я пробовал с InlineModelAdmin , но поскольку Book имеет много полей, редактировать их нелегко.
Вот почему я попытался разместить ссылки на children на шаблоне автора / изменения.

<ul>
  <li><a href="{% url admin:content_scribpart_add %}">Add a Book</a></li>
{% for book in original.book_set.all %}
  <li><a href="{% url admin:myapp_book_change book.id %}">Edit {{ book }}</a></li>
{% endfor %}
</ul>

Но есть несколько вопросов

  • Как я могу предварительно заполнить связанный Author идентификатор в Book форме
  • Как сделать кнопку Сохранить , чтобы вернуться к Author
  • Я на правильном пути?

1 Ответ

4 голосов
/ 09 ноября 2011

Да, конечно.

  1. Добавьте author первичный ключ в качестве параметра GET к вашему URL:

    <ul>
      <li><a href="{% url admin:content_scribpart_add %}?author={{ object_id }}">Add a Book</a></li>
    {% for book in original.book_set.all %}
      <li><a href="{% url admin:myapp_book_change book.id %}?author={{ object_id }}">Edit {{ book }}</a></li>
    {% endfor %}
    </ul>
    
  2. Измените соответствующий ModealAdmin для книгипереопределить response_add() и response_change().Обратите внимание, что мы также переопределяем formfield_for_forein_key, чтобы предварительно заполнить поле author:

    from django.http import HttpResponseRedirect
    from django.core.urlresolvers import reverse
    
    class BookAdmin(admin.ModelAdmin):
    
        def formfield_for_foreignkey(self, db_field, request, **kwargs):
            if db_field.name == "author":                    
                try:
                    author_pk = int(request.GET.get('author', ''),) 
                except ValueError:           
                    pass
                else:
                    kwargs["initial"] = Author.objects.get(pk=author_pk)
    
            return super(BookAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
    
        def response_add(self, request, obj, post_url_continue=None):
            return HttpResponseRedirect(reverse('admin:myapp_author_change', args=(obj.author.pk,))
            )
    
        def response_change(self, request, obj, post_url_continue=None):
            return HttpResponseRedirect(reverse('admin:myapp_author_change', args=(obj.author.pk,))
            )
    
...