2017-04-17 8 views
0

私はdjangoフォームで動的なドロップダウンオプションリストを作成しようとしていますが、最初の辞書 'key'で表示できません。
フォームの選択辞書には、「名前」と「電子メール」という2つのキーが含まれています。また、 'name'の代わりに2番目のキー( 'email')でオプションを表示しています。コードの良いところは、それが動作することである最初の 'key'でDjangoフォームにドロップダウンを表示

def print(request): 
    if request.method == 'POST': 
     form = PrintForm(data=request.POST, request = request) 

     if form.is_valid(): 
      contact_name = request.POST.get(
       'contact_name' 
       , '') 
      contact_email = request.POST.get(
       'contact_email' 
       , '') 
      form_content = request.POST.get('content', '') 
      supervisor = form.cleaned_data['supervisor'] 
      supervisor = dict(form.fields['supervisor'].choices)[supervisor] 
      # Email the profile with the 
      # contact information 
      template = get_template('threeD/email/contact_template_for_printing.txt') 
      context = Context({ 
       'contact_name': contact_name, 
       'supervisor': supervisor, 
       'contact_email': contact_email, 
       'form_content': form_content, 
      }) 
      content = template.render(context) 

      email = EmailMessage(
       "New message from " + contact_name, 
       content, 
       "Message - " + supervisor + ' ', 
       [supervisor], 
       headers={'Reply-To': contact_email} 
      ) 
      email.send() 
      messages.success(request, "Thank you for your message.") 
      return redirect('/index/print/') 

    else: 
      form = PrintForm(request=request) 
    context_dict = {} 
    context_dict['printers'] = Printer.objects.all() 
    context_dict['form'] = form 
    return render(request, 'threeD/print.html', context_dict) 

class Supervisors(models.Model): 
    name = models.CharField(max_length=200) 
    email = models.EmailField(max_length=100) 

マイ形式:

supervisors = [] 
all_supervisors = Supervisors.objects.all() 
for user in all_supervisors: 
    one_supervisor = {user.name.__str__() : user.name, user.email.__str__() : user.email} 
    supervisors.append(one_supervisor) 

class PrintForm(forms.Form): 
    contact_name = forms.CharField(required=True) 
    contact_email = forms.EmailField(required=True) 
    supervisor = forms.ChoiceField(choices=supervisors) 

    content = forms.CharField(
     required=True, 
     widget=forms.Textarea 
    ) 

そして、私のビューここ
は、私が何を意味するか
私のモデルであり、私が思うように電子メールを送信しますが、私の問題はドロップダウンリストを名前で表示する必要があることですが、代わりに電子メール。それが何をするかだ
:/

答えて

1

、モデルSupervisorsに、このメソッドを追加します。これにより

# change method name to __unicode__ if you are with Python 2.x 
def __str__(self): 
    return self.name 

、モデルに作られた任意のクエリ内のすべてのインスタンスはnameフィールドの値を返します。

は、第二に、あなたのフォームの構造を改善するために、これを試してみてください。

class PrintForm(forms.Form): 
    supervisor = forms.ChoiceField(choices=[ 
(supervisor.email, supervisor.name) for supervisor in Supervisors.objects.all()) 

もう一つは、Supervisorにモデル名を変更することをお勧めします。クラスは特定のオブジェクトのテンプレートであるため、単数形の名前でクラス名を付ける方がよいでしょう。

+0

ありがとう、Alix!出来た! –

+0

あなたを助けてうれしい!。あなたが答えを投票した方が良いです:) @IljaLeiko – alix

+0

申し訳ありません、私はコミュニティで新しいです:D完了。 –

2

は試してみてください:

class PrintForm(forms.Form): 
    contact_name = forms.CharField(required=True) 
    contact_email = forms.EmailField(required=True) 
    supervisor = forms.ChoiceField(
     choices=[(str(sup.email), str(sup.name)) for sup in Supervisors.objects.all()] 
    ) 

とコードがsupervisorsリストが必要とされていない埋めるために私が捕まってしまった原因はすべてのヘルプは非常に多く、高く評価されるだろう enter image description here

あなたは、モデルの __str____unicode方法を変更してOKであれば
+0

ああ、素晴らしい!ありがとう、それは働いた! "supervisor = dict(form.fields ['supervisor']。choices)[supervisor]"という行を削除しなければなりませんでした。ありがとうございます –

+2

@IljaLeikoは助けてうれしい –

関連する問題