使用单选按钮在 Django admin 中选择项目

Posted

技术标签:

【中文标题】使用单选按钮在 Django admin 中选择项目【英文标题】:Select item in Django admin inline with radio buttons 【发布时间】:2010-11-28 19:10:07 【问题描述】:

这是我的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 与管理员中的 Person 内联编辑。另外,我希望 PersonName 的 default_name 字段显示为单选按钮,这样每个人只有一个 PersonName 可以具有 default_name=True。

最后一部分才是最难的。在 Django 中,在表单中有一个单选按钮界面相对容易。拥有一个从本质上选择表单集中的一种表单似乎要困难得多。

这样做的一种方法是将 javascript 添加到 Person 的 change_form.html 中,它使用正则表达式来匹配 default_name 的 元素,并确保选中其中一个元素会取消选中其余元素。但是,如果 Django 命名 HTML 表单字段的约定发生变化,这似乎可能会被打破;此外,它只会解决使用支持 JavaScript 浏览器的用户的问题。

如果有更好的想法,感激不尽!

2009 年 9 月 17 日更新

以下管理模板扩展(基于 this 和 this)实现了上面的 JavaScript 建议,但欢迎提供更好的解决方案!

% extends "admin/change_form.html" %

% block extrahead %
    <script src="/site_media/jquery-1.3.2.min.js" type="text/javascript"></script>
    <script type="text/javascript">
        jQuery(document).ready(function()
            // Replace default_name checkboxes with radio buttons.
            $(".default_name input").each(function()
                var name = $(this).attr('name'); // grab name of original
                var id = $(this).attr('id'); // grab id of original
                if ($(this).attr('checked'))  // grab checked value of original
                    var checked = ' checked="checked"';
                 else 
                    var checked = '';
                
                /* create new visible input */
                var html = '<input type="radio" name="'+name+'" id="'+id+'" value="True"'+checked+' />';
                $(this).after(html).remove(); // add new, then remove original input
            );
            // Ensure only one default_name radio button can be checked at a time.
            $(".default_name input").click(function()
                $(".default_name input").not(this).removeAttr("checked");
            );
        );
    </script>
% endblock %

【问题讨论】:

【参考方案1】:

我认为你不会得到传统的纯 HTML 方法来做你想做的事。

你不应该在这里依赖正则表达式。你不能在输入字段中添加一个类名,以便 jquery...

我想这比我最初想象的要难(在这里回答): Define css class in django Forms

不过,这只是一个稍微好一点的解决方案。

【讨论】:

以上是关于使用单选按钮在 Django admin 中选择项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在Django管理员中制作单选按钮

如何根据在模型级别定义的枚举字段在 Django Modelform 中呈现单选按钮选择?

如何编写代码,以便在带有django的模型中只选择一个单选按钮。

在django中将注册表单填写到数据库后如何存储用户选择的单选按钮值?

Asp.net Webform 中用于多项选择问题的单选按钮

如何在 Django 中呈现单个单选按钮选项?