Заполните раскрывающийся список в соответствии с другим вариантом раскрывающегося списка в Django Admin - PullRequest
0 голосов
/ 08 июня 2010

У меня есть такие модели:

class User(models.Model): 
    Switch = models.ForeignKey(Switch, related_name='SwitchUsers') 
    Port = models.ForeignKey(Port) 
class Switch(models.Model): 
    Name = models.CharField(max_length=50) 
class Port(models.Model): 
    PortNum = models.PositiveIntegerField() 
    Switch = models.ForeignKey(Switch, related_name = "Ports") 

Когда я нахожусь в интерфейсе администратора и выбираю «Переключить из доступных коммутаторов», я хотел бы, чтобы порт был предварительно заполнен соответственно портами из соответствующего коммутатора.Насколько я понимаю, мне нужно создать какой-нибудь JS-скрипт, чтобы предварительно заполнить его.К сожалению, у меня нет такого опыта, и я хотел бы сделать все как можно проще и не переписывать весь интерфейс администратора Django.Просто добавьте эту функциональность для одного поля.

Не могли бы вы помочь мне с моей проблемой?Спасибо.

Ответы [ 3 ]

1 голос
/ 09 июня 2010

Вы правы, что вам понадобится несколько js, чтобы создать это.Вам не нужно переписывать интерфейс администратора django.Вам нужно только настроить его.Для этого типа вещей требуется несколько вещей.

Начните здесь: http://docs.djangoproject.com/en/1.2/ref/contrib/admin/#modeladmin-objects

Чтобы включить свой JavaScript, используйте Media class .

.Формы django дают всем входным формам одинаковые идентификаторы, поэтому ими легко манипулировать.Однако вам нужно будет «передать» ваши отношения клиенту.Я имею в виду, что на клиенте вам нужно знать, с каким Ports и с каким Switch.В зависимости от того, сколько у вас есть данных, есть несколько подходов к этому:

  • Кодируйте отношение в json и выводите его в теге с помощью , настраивая шаблон администратора для вашей модели.

  • Используйте ajax.Вам понадобится как минимум одно дополнительное представление, которое принимает Switch и возвращает список json (или что-то подобное) для Ports, который идет с ним.

Манипуляция JavaScriptдолжно быть прямым: вы хотите связать событие onChange() в выпадающем списке с функцией, которая удаляет все, кроме соответствующего Ports в выпадающем списке портов.1032 * JQuery .

0 голосов
/ 10 июня 2010

Я понимаю, что это ярлык, и он может быть неоптимальным, но рассматривали ли вы возможность объединения двух выбранных виджетов в один, используя optgroups?Это избавит вас от написания собственного javascript.

Поскольку это ForeignKey, если они выбирают порт, вы знаете, что это за коммутатор.Вы можете сделать переключатели оптгруппами со значением «», чтобы они не могли сохранить после выбора только переключателя.Вот шаги, которые я вижу:

  1. Настройте поля формы, чтобы пропустить switch.
  2. Измените заголовок поля формы port на Switch / Port.
  3. Измените choices поля формы port на кортеж, сгенерированный из коммутаторов / портов.
  4. Добавьте пользовательское представление для сохранения, которое получает коммутатор отпорт и устанавливает на него переключатель пользователя.

Если пользователи / заинтересованные стороны сочтут это приемлемым, это способ обойти программирование на JavaScript, которое включает в себя немало программирования на Django.

0 голосов
/ 09 июня 2010

Вы можете получить более простое решение, чем указано выше. Вместо того, чтобы настраивать шаблон и помещать json в тег, поместите этот json в начало вашего js-файла, а также поместите туда вызов $ (). Ready, который назначит слушателя событию изменения окна выбора и ссылается на этот js-файл в Медиа ModelAdmin.

class MyAdmin(admin.ModelAdmin):
    class Media:
        js = ("my_code.js",)

Подсказка: используйте Firebug или Chrome инспектор, чтобы исследовать реальные имена полей HTML в форме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...