0

モデルフォームとウィジェットに関するドキュメントを読むと、どのモデルフォームでも任意のウィジェットを使用できるように見えますが、モデルフォームフィールドに対応するフォームフィールドに使用される特定のデフォルトウィジェットがあります。フォームフィールドを使用してラジオ入力をレンダリングすることはできますが、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>

からレンダリングされるフォーム{{ show_nickname_form.as_ul }}

<li><label for="id_show_nickname_0">show nickname:</label> 
<ul></ul>
</li> 
<div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='1BqD6HJbP5e01NVwLtmFBqhhu3Y1fiOw' /></div>`

試行2: #forms.py from django import forms from models import Profile

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_nicknameこれにより、ラジオ入力は正常になりますが、定数の代わりに、対応するモデルフィールドの初期値を取得する必要がありますTrue

私はDjango 1.4ところで使用しています。

4

1 に答える 1

1

ラジオボタンを表示するには 、それぞれに選択肢があり、のChoiceField代わりに作成する必要があります。https://docs.djangoproject.com/en/dev/ref/forms/fields/#django.forms.ChoiceFieldBooleanFieldRadioWidget

ブールフィールドを保持したい場合は、独自のフィールド/ウィジェットを作成するためにハッキングを行う必要があります。


# 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
于 2013-03-27T14:50:16.427 に答える