2017-08-24 3 views
0

基本的には、Queueというフィールドのラジオ選択ウィジェットを持つフォームがあります。 Queueにはでアクセスして設定したmodelからの4つの選択肢があります。私は{{form.queue.0}}{{form.queue.1}}のようにテンプレートにこのフォームをレンダリングしています。例えばdjangoレンダリングされたフォームフィールドのHTML "value"を変更することはできますか?

{{form.queue.3}}は私を与える:

<input id="id_queue_3" name="queue" value="2" type="radio"> 

あなたが見ることができるように、値とフィールドインデックス不一致がある - queue.3value="2"として表示され、これは、値を使用して、いくつかのJSをいじっているが各ラジオボタンの下にあるメニューの右側のサブセットを開きます。

手動でvalueを指定して、テンプレートにラジオフィールドを表示することはできますか?

マイforms.py

form = PublicTicketForm(initial=initial_data) 
     form.fields['queue'].choices = [('', 'Other')] + [ 
      (q.id, q.title) for q in Queue.objects.filter(allow_public_submission=True)] 
+0

この入力タグのHTMLのvalue属性にどのような値(2ではなく)を指定しますか: "" ? –

+0

リスト3にあるので、3としましょう。 – Di437

+0

投稿した回答を確認してください。それが役立つかどうかを見てください。 –

答えて

0

あなたのコードに次のように試してみてください:このフォームのための私のviews.py

class PublicTicketForm(): 
    queue = forms.ChoiceField(
      widget=forms.RadioSelect(), 
      label=_('What do you need help with?'),  
      required=True, 
      choices=() 
     ) 

form = PublicTicketForm(initial=initial_data) 
    form.fields['queue'].choices = [('', 'Other')] + [ 
     ((int(q.id)+1), q.title) for q in Queue.objects.filter(allow_public_submission=True)] 

注:私はあなたが望んでいたと仮定しでの一定の変化(1増分) <input>タグのvalue属性です。例えば

queue = forms.ChoiceField(
     widget=forms.RadioSelect(), 
     label=_('What do you need help with?'),  
     required=True, 
     choices=() 
    ) 

属性choicesは、単純なタプルをとるような構造:コードスニペットに:

<input id="id_queue_3" name="queue" value="2" type="radio"> 
<input id="id_queue_4" name="queue" value="3" type="radio"> 

<input id="id_queue_3" name="queue" value="3" type="radio"> 
<input id="id_queue_4" name="queue" value="4" type="radio"> 

はこれを詳述すると次のようになります。

(('I_become_the_value_1' , 'I_appear_on_browser_screen_1'), 
('I_become_the_value_2' , 'I_appear_on_browser_screen_2'), 
#and so on... 
) 

あなたはタプルの最初の指標として(q.idがモデルのPK値である)PKを供給しているときに、PK値は、実際に<input>タグにvalue属性になります。

注:あなたは常にジャンゴでChoiceFieldの骨格構造中に<input>タグでこのvalue属性ことを知っている必要があります。ユーザーが選択した値のマッピングに役立ちます。

最後にです。ユーザーが選択した正確な値が、クロスチェックによってフォームが送信されたときに正しく取得されていることを確認してください。そこにも微調整が必​​要な場合があります。 ブラウザでユーザーが選択した選択肢が、ビュー内で正しく受信されない可能性があります。(PK値が混ざってしまうかもしれません)

EDIT:尋ねたよう、私もPKで増分を使用することは非常に良い解決策ではないと感じています。これを避けるには、プライマリキーフィールドをUUIDFieldに宣言します。それについて読むhere. 属性の大きい文字列(一意)を<input>タグにすることができます。それが好きで使用してください:

あなたのmodels.py内部:

class Queue(models.Model): 
    #all your fields. 
    alternative_unique_id = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) 
    #Rest of the code. 

今、あなたは、同じ方法でそれを照会したが、タプルの最初の指標としてalternative_unique_fieldを追加することができます。

あなたのviews.pyで

form = PublicTicketForm(initial=initial_data) 
form.fields['queue'].choices = [('', 'Other')] + [ 
    (q.alternative_unique_id, q.title) for q in Queue.objects.filter(allow_public_submission=True)] 

また、あなたにも主キーとしてこのalternative_unique_idを宣言することができます。 これはデータベースのスペースを節約します。

UUIDFieldを使用する代わりに、を使用すると、primary_key=Trueをフィールド内に設定するだけで独自のプライマリキーフィールドを作成できます。

name = models.CharField(primary_key = True , max_length = 64) 

をしかしが、常に一意であると<input>タグのvalue属性内の適切な値を得るためにあなたのform.fields['queue'].choicesにいくつかのロジックを変更するために起こっていることを確認してください:あなたは好きでそれを行うことができます。

希望すると、これが役立ちます。ありがとう。

+0

この回答ありがとうございましたが、あなたが言ったように、 "価値"はモデルのpkフィールドから来ており、私はそれが自動増加すると思います。 1を追加する際の問題は、これらのモデルに新しいオブジェクトを追加したり追加したりするときに問題が生じることです。私が何かできることは、おそらく別の一意のフィールドに "値"タグを設定し、値の代わりに名前をチェックするために私のビューを変更するか? – Di437

+0

@ Di437私はあるかもしれないと思います。私の答えを更新している間お待ちください。 –

+0

@ Di437もう一度更新しました。それが役立つかどうかを見てください。 –

関連する問題