Выберите объект в администраторе Django, встроенном с переключателями

Вот часть моего models.py:

class Person(models.Model):
    birth_year = WideYear(null=True, blank=True)
    birth_year_uncertain = models.BooleanField()
    death_year = WideYear(null=True, blank=True)
    death_year_uncertain = models.BooleanField()
    flourit_year = WideYear(null=True, blank=True)
    flourit_year_uncertain = models.BooleanField()
    FLOURIT_CHOICES = (
        (u'D', u'Birth and death dates'),
        (u'F', u'Flourit date'),
    )
    use_flourit = models.CharField('Date(s) to use', max_length=2, choices=FLOURIT_CHOICES)
    def __unicode__(self):
        if self.personname_set.filter(default_name__exact=True):
            name = z(self.personname_set.filter(default_name__exact=True)[0])
        else:
            name = u'[Unnamed person]'
        if self.use_flourit == u'D':
            dates = '%s - %s' % (z(self.birth_year), z(self.death_year))
        else:
            dates = 'fl. %s' % (z(self.flourit_year))
        return '%s (%s)' % (name, dates)
    class Meta:
        ordering = ['ordering_string']

class PersonName(models.Model):
    titles = models.CharField(max_length=65535, null=True, blank=True)
    surname = models.CharField(max_length=255, null=True, blank=True)
    first_name = models.CharField(max_length=255, null=True, blank=True)
    middle_names = models.CharField(max_length=255, null=True, blank=True)
    post_nominals = models.CharField(max_length=65535, null=True, blank=True)
    default_name = models.BooleanField()
    person = models.ForeignKey(Person, null=True, blank=True)
    def __unicode__(self):
        return '%s, %s %s' % (self.surname, self.first_name, self.middle_names)
    class Meta:
        unique_together = ("titles", "surname", "first_name", "middle_names", "post_nominals", "person")
        unique_together = ("default_name", "person")
post_save.connect(post_save_person_and_person_name, sender=PersonName)

Я хочу, чтобы PersonName был доступен для редактирования встроенный с Человеком в администраторе как TabularInline. Кроме того, я хочу, чтобы default_name поле PersonName отобразилось как переключатель, такой, что только один PersonName на человека может иметь default_name=True.

Это - та последняя часть, это - твердый бит. Наличие интерфейса переключателя в форме относительно легко в Django. Имение того, которое выбирает, по существу, одну форму в formset, кажется, очень, намного тяжелее.

Один способ сделать это должно было бы добавить JavaScript к change_form.html для Человека, который использует regex для соответствия <вход> элементам для default_name и удостоверяется, что проверка одного из них сняла флажок с остальными. Но это кажется, как будто это могло бы стать поврежденным, если конвенция Django для именования полей HTML-формы изменяется; плюс, это только зафиксировало бы вопросы для пользователей с поддерживающими JavaScript браузерами.

С благодарностью получены любые лучшие идеи!

ОБНОВЛЕНИЕ 17.09.2009

Следующий администратор обрабатывает расширение по шаблону (на основе этого, и это) реализует предложение JavaScript выше, но лучшие решения были бы одобрены!

{% extends "admin/change_form.html" %}

{% block extrahead %}
    
    
{% endblock %}

23
задан Community 23 May 2017 в 12:34
поделиться