質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.64%

'RadioSelect' object has no attribute 'renderer'

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,085
退会済みユーザー

退会済みユーザー

AttributeError at /polls/1/
'RadioSelect' object has no attribute 'renderer'
とエラーが出ました。
forms.py の line 21 の init でエラーが起きていると出たのですが。。。
forms.pyには

from django import forms

class MyForm(forms.Form):
    text = forms.CharField(max_length=100,required=False,label='テキスト')

class VoteForm(forms.Form):
    choice = forms.ModelChoiceField(
        queryset=None,
        label='選択',
        widget=forms.RadioSelect(),
        empty_label=None,
        error_messages={
            'required':"You didn't select a choice.",
            'invalid_choice':"invalid choice.",
        },
    )

    def __init__(self,question,*args,**kwargs):
        super().__init__(*args,**kwargs)
        self.fields['choice'].queryset = question.choice_set.all()
        self.fields['choice'].widget.renderer.inner_html = '{choice_value}{sub_widgets}<br>'


と書きました。
ラジオボタンなどの設定は、
detail.htmlに以下のように書きました。

<!DOCTYPE html>
<h1>{{ question.question_text }}</h1>
{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'poll_vote' question.id %}" method="post">
<!--<form action="" method="post">-->
    {% csrf_token %}
    {% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
    {% endfor %}
    <!--{{ form }}-->
    <input type="submit" value="Vote" />
</form>
</html>


どう直せば良いのでしょうか?

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

__init__の中で、self.fields['choice'].widget.renderer.inner_html = '{choice_value}{sub_widgets}<br>'を設定していますが、どのような意図があるのでしょうか。

StackOverflowにも同様の質問がありました。
https://stackoverflow.com/questions/45793248/radioselect-object-has-no-attribute-renderer

上記によると、

>>> dir(f.fields['choice'].widget)
['__class__', '__deepcopy__', '__delattr__', '__dict__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__slotnames__', '__str__', 
'__subclasshook__', '__weakref__', '_format_value', '_render', 
'add_id_index', 'allow_multiple_selected', 'attrs', 'build_attrs',
'checked_attribute', 'choices', 'create_option', 'format_value',
'get_context', 'id_for_label', 'input_type', 'is_hidden', 'is_localized',
'is_required', 'media', 'needs_multipart_form', 'optgroups', 
'option_inherits_attrs', 'option_template_name', 'options', 'render',
'subwidgets', 'supports_microseconds', 'template_name',
'use_required_attribute', 'value_from_datadict', 'value_omitted_from_data']

ということで、self.fields['choice'].widgetには、rendererというアトリビュートは無いようです。

また、記載されているテンプレートでのformの描画方法であれば、self.fields['choice'].widget.renderer.inner_html = '{choice_value}{sub_widgets}<br>'は不要ではないかと思います。

何か意図があったり、参照した資料があれば、そちらを提示いただくと、より正しい回答が出てくると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる