Django 哪些模型字段可以与radio小部件一起使用(通过modelform)?

Django 哪些模型字段可以与radio小部件一起使用(通过modelform)?,django,django-forms,Django,Django Forms,当我阅读有关modelforms和widget的文档时,看起来您可以在任何modelform上使用任何widget,但是有一些默认的widget用于对应于modelform字段的表单字段。我可以使用表单字段渲染无线电输入,但不能使用modelform字段 我尝试了许多不同的方法,但我似乎无法呈现来自模型字段的modelform字段的RadioSelect小部件。这可能吗 顺便说一句,我的目标是让无线电输入的初始值与模型字段的当前值(布尔值)相对应 尝试1: # views.py class Se

当我阅读有关modelforms和widget的文档时,看起来您可以在任何modelform上使用任何widget,但是有一些默认的widget用于对应于modelform字段的表单字段。我可以使用表单字段渲染无线电输入,但不能使用modelform字段

我尝试了许多不同的方法,但我似乎无法呈现来自模型字段的modelform字段的RadioSelect小部件。这可能吗

顺便说一句,我的目标是让无线电输入的初始值与模型字段的当前值(布尔值)相对应

尝试1:

# views.py
class SettingsView(FormView):
    template_name = 'settings.html'
    success_url = 'settings/saved/'
    form_class = NicknameForm

    def post(self, request, *args, **kwargs):
        profile = request.user.get_profile()
        if request.POST['show_nickname'] == 'False':
            profile.show_nickname = False
            profile.save()         
        elif request.POST['show_nickname'] == 'True':
            profile.show_nickname = True
            profile.save()

        return super(NicknameFormView, self).post(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        """
        To be able to use 'show_nickname_form' instead of plain 'form' in the template.
        """        
        context = super(NicknameFormView, self).get_context_data(**kwargs)
        context["show_nickname_form"] = context.get('form')
        return context


# models.py 
from django.db import models
from django.contrib.auth.models import User

class Profile(models.Model):
    user = models.OneToOneField(User,
                                unique=True,
                                verbose_name='user',
                                related_name='profile')
    show_nickname = models.BooleanField(default=True)


# forms.py
from django import forms
from models import Profile    

CHOICES = (('shows_nickname', 'Yes'), ('hides_nickname', 'No'))

class NicknameForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('show_nickname',)
        widgets = {
            'show_nickname': forms.RadioSelect(attrs={'choices': CHOICES}),
        }
我的模板中的部分:

        <form action='' method="post">
            {{ show_nickname_form.as_ul }} {% csrf_token %}
            <input type="submit" value="Save setttings">
        </form>
尝试2: #forms.py 来自django导入表单 从模型导入配置文件

class NicknameForm(forms.ModelForm):
    class Meta:
        model = Profile
        fields = ('show_nickname',)
        widgets = {
            'show_nickname': forms.RadioSelect(),
        }
尝试3次

# forms.py
CHOICES = ((True, 'On',),
  (False, 'Off',))

class NicknameForm(ModelForm):
    show_nickname = ChoiceField(widget=RadioSelect, choices=CHOICES, initial=True , label='')

    class Meta:
        model = Profile
        fields = ('show_nickname',)
这使得无线电输入很好,但我需要它取相应模型字段
show_昵称
的初始值,而不是常量
True


我使用的是
Django 1.4
顺便说一句。

您需要将其设置为
选择字段
,而不是
布尔字段
,每个字段都有一个选择,并设置一个
RadioWidget
,以便显示单选按钮。

如果您想保留布尔字段,您很可能需要进行一些黑客操作来创建自己的字段/小部件



显示您尝试过的内容。当您尝试其中任何一种时会发生什么?无线电输入渲染不好,我编辑了原始帖子以显示尝试1后渲染的内容。顺便说一句,当我省略
widgets={'Show\u昵称':forms.RadioSelect(attrs={'choices':choices})时,}
line表单以复选框的形式呈现。您知道可能出现的错误吗?你能确认你能从一个模型的布尔场实现一个无线电吗?在这一点上,最有可能的结论是,您无法在布尔域上实现RadioSelect小部件。但是文档并不清楚哪些widget可以与imo中的哪些字段一起使用。我知道如何实现RadioWidget(参见尝试3),但我一直面临的问题是让radio的初始值对应于我的模型中的布尔值
show\u昵称
。我认为在尝试1中实现它会“自动”获取模型的初始值。您知道如何让收音机的值与登录用户的配置文件模型的
show\u昵称
(布尔值)的值相对应吗?您在哪里使用该表单?在呈现表单之前,您通常可以钩住方法来修改表单数据。@Bentley4如果您添加了视图,我可以尝试帮助您。@Bentley4检查我的编辑,让我知道这是否是您想要的。等等,您是否感到惊讶?是的,非常感谢你!!!对于这些事情,基于类的视图实际上是粗糙的
# forms.py
CHOICES = ((True, 'On',),
  (False, 'Off',))

class NicknameForm(ModelForm):
    show_nickname = ChoiceField(widget=RadioSelect, choices=CHOICES, initial=True , label='')

    class Meta:
        model = Profile
        fields = ('show_nickname',)
# views.py
class SettingsView(FormView):
    template_name = 'settings.html'
    success_url = 'settings/saved/'
    form_class = NicknameForm

    def get_form(self, form_class):
        """
        Returns an instance of the form to be used in this view.
        """
        form = super(SettingsView, self).get_form(form_class)

        if 'show_nickname' in form.fields:
            profile = self.request.user.get_profile()
            form.fields['show_nickname'].initial = profile.show_nickname

        return form

    def post(self, request, *args, **kwargs):
        profile = request.user.get_profile()
        if request.POST['show_nickname'] == 'False':
            profile.show_nickname = False
            profile.save()
        elif request.POST['show_nickname'] == 'True':
            profile.show_nickname = True
            profile.save()

        return super(NicknameFormView, self).post(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        """
        To be able to use 'show_nickname_form' instead of plain 'form' in the template.
        """
        context = super(NicknameFormView, self).get_context_data(**kwargs)
        context["show_nickname_form"] = context.get('form')
        return context