2010-02-27 2 views
7

Эта тема довольно распространена (наиболее подробно здесь: http://www.hoboes.com/Mimsy/hacks/replicating-djangos-admin/), но у меня все еще есть проблемы с ней. Я пытаюсь использовать функциональность кнопки «плюс», используемую на сайте администратора, где можно добавить дополнительный внешний ключ к связанной записи. В админ-сайте отображаются всплывающие окна, позволяющие пользователю вводить новое поле, а затем новое значение заполняется в исходной форме.Django Admin popup функциональность

Я думаю, что моя проблема центров вокруг включения этой линии:

в шаблоне base.html и шаблона popadd.html. При нажатии кнопки «плюс» не появляется новое окно. Шаблон popadd просто загружается на одной вкладке. И отправка новой записи не возвращает пользователя в исходную форму.

Административный сайт функциональный. Я включаю ADMIN_MEDIA_PREFIX = '/ media/admin /' в файле settings.py. Имеет ли это какое-то отношение к тому, где живет RelatedObjectLookups.js? В настоящее время он находится в директории администратора вне моей папки проекта. Мне нужно создать символическую ссылку?

Извините за вопросы о нобе. Поблагодарю любые предложения (как можно более подробно).

+0

Какой браузер вы используете? Какие плагины (если есть) вы установили и как они настроены? В FF * Tab Mix Plus * (среди прочих) способна радикально изменять поведение всплывающего окна/нового окна. –

+0

Я использую firefox. Но я не думаю, что это связано с плагинами/конфигурацией. Функциональность администратора прекрасно работает на сайте администратора. Когда я пытаюсь использовать его вне этой структуры, я не могу заставить его работать правильно. –

ответ

4

Я также создал приложение, вы можете просто включить в своем проекте в http://github.com/sontek/django-tekextensions

+0

Хороший ответ, но нуждается в обновлении. Например, «ADMIN_MEDIA_PREFIX» устарел. django-tekextensions было бы хорошо, если бы оно было в конце описания ...;] –

+2

Ссылка на ваш блог в настоящее время не работает –

+2

Всегда рекомендуется указывать со страницы, на которую вы ссылаетесь. В случае нарушения связи в будущем ответ остается в силе. –

5

После шагов, описанных ниже, позволит вам воссоздать соответствующий объект всплывающей функциональность Джанго админа без создания каких-либо пользовательских виджетов, просмотров и URL-адресов. Эти шаги предполагают, что вы пытаетесь открыть это всплывающее окно в своем собственном админ-сайте, который подклассифицирует администратор Django.

Давайте предположат, что следующие две моделей на сайте и Автор, с FK из книги автора. Позволяет также предположить, что мы хотим возможность использовать Связанные объекта Pop-Up добавить Автор при создании/редактировании книги:

[app_name] /models.py:

from django.db import models 

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

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

Позволяет создать свой собственный сайт администратора:

[app_name] /sites.py:

from django.contrib.admin.sites import AdminSite 

my_admin_site = AdminSite(name='my_custom_admin') 

Наш пользовательский администратор сайта будет зарегистрировать два ModelAdmins, чтобы позволить пользователям добавлять/редактировать/удалять обе модели книги и Автор:

[app_name] /admin.py:

from django.contrib.admin.options import ModelAdmin 

from [app_name].forms import BookForm # We'll create this form below 
from [app_name].models import Author, Book 
from [app_name].sites import my_admin_site 

class BookModelAdmin(ModelAdmin): 
    form = BookForm() 

# Register both models to our custom admin site 
my_admin_site.register(Author, ModelAdmin) 
my_admin_site.register(Book, BookModelAdmin) 

Теперь мы 'll setup BookForm, который используется в BookModelAdmin выше. Здесь происходит волшебство. Для получения дополнительной информации о RelatedFieldWidgetWrapper api, click here:

[имя_приложения]/формы.ру:

from django.contrib.admin.widgets import RelatedFieldWidgetWrapper 
from django import forms 

from [app_name].models import Book 
from [app_name].sites import my_admin_site 

class BookForm(forms.ModelForm): 
    author = Book._meta.get_field('author').formfield(
     widget=RelatedFieldWidgetWrapper(
      Book._meta.get_field('author').formfield().widget, 
      Book._meta.get_field('author').rel, 
      my_admin_site, 
      can_add_related=True 
     ) 
    ) 

    class Meta: 
     model = Book 

Примечания:

  1. Вы должны убедиться, что эти два JavaScript-файлы, включенные в шаблонах: admin/js/core.js и admin/js/admin/RelatedObjectLookups.js.

Gotchas:

  1. is_popup необходимо задать и передается правильно в шаблонах. В частности, в любых настраиваемых шаблонах change_form.html вы должны запомнить эту строку где-то в ваших тегах формы: {% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}, чтобы логика в BaseModelAdmin.response_add() вернула правильный ответ.

Under The Hood: По существу, мы повторно использовать логику обработки форм, виджетов обертку и JavaScript, который уже входит в Django администратора.

  1. Использование RelatedFieldWidgetWrapper обернуть виджет, связанный с соответствующей предметной областью в нашей форме (а именно прохождение can_add_related=True в конструкторе) рассказывает виджет для добавления необходимого «+» связи с подходящим яваскриптом OnClick события прикрепленного к нему ,
  2. javascript администратора Django обрабатывает всю логику, необходимую для запуска всплывающего окна.
  3. Логика в нашем change_form.html шаблонах (шаблонов) и логике в BaseModelAdmin.response_add() обрабатывает сохранение нового связанного объекта и возвращает соответствующий ответ javascript, который информирует всплывающее окно, которое необходимо закрыть.

Связанные Repo: Это публичное репо должен предоставить образец кода для проекта Django рассмотренном выше: https://github.com/cooncesean/Books

+0

Tks, именно то, что мне нужно! BTW, теперь вы можете перезаписать виджет внутри класса Meta, а не переписывать все поле -> https://docs.djangoproject.com/en/1.7/topics/forms/modelforms/#overriding-the-default-fields – alfetopito

2

Google указал мне на этой странице при поиске, как получить значок «+» рядом с полями в пользовательской форме с отношениями ForeignKey (как и сайт администратора), поэтому я подумал, что добавлю.

Для меня, используя django-autocomplete-light, этот трюк очень хорошо, используя функцию «добавить еще». См. this live demo.

См. Также Django ModelChoiceField has no plus button.

-1

Если в администратора вы хотите отобразить связанные объекты в модальностей вместо старых всплывающих окон я предлагаю вам попробовать django-admin-interface.

Чтобы установить его выполните следующие действия:

  • pip install django-admin-interface
  • Добавить admin_interface, flat_responsive и colorfield к settings.INSTALLED_APPSперед темdjango.contrib.admin
  • python manage.py migrate
  • python manage.py collectstatic

Для получения более подробной информации см. django-admin-interface на GitHub.

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