2017-04-11 11 views
1

入力テキストボックスの初期値として使用するために、ユーザーオブジェクトまたは要求をフォームに渡すにはどうすればよいですか?例えばDjangoのフォームにユーザーオブジェクトを渡す方法

、私は自分のフォームを持っている:

私は私のuser.first_nameがCONTACT_NAMEフィールドのデフォルト値としてなりたい
class ContactForm(forms.Form): 
contact_name = forms.CharField(required=True, initial="???") 
contact_email = forms.EmailField(required=True) 
subjects = forms.ChoiceField(choices=emailsubjects) 
content = forms.CharField(
    required=True, 
    widget=forms.Textarea 
) 

def __init__(self, *args, **kwargs): 
    self.request = kwargs.pop("request") 
    super(ContactForm, self).__init__(*args, **kwargs) 
    self.fields['contact_name'].label = "Your name:" 
    self.fields['contact_email'].label = "Your email:" 
    self.fields['content'].label = "What do you want to say?" 
    self.fields['subjects'].label = "Please, select the subject of your message" 

def ContactsView(request): 
form_class = ContactForm(request=request) 
# new logic! 
if request.method == 'POST': 
    form = form_class(data=request.POST) 

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

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


return render(request, 'threeD/contacts.html', { 
    'form': form_class, 
}) 

すべてのヘルプは非常にあなたがビューに初期値を渡す必要があり

答えて

0

リクエストオブジェクトを取得するようにフォームを変更しました。したがって、あなたは、フォームのメソッド内self.request.userにアクセスすることができます。

class ContactForm(forms.Form): 
    ... 
    def __init__(self, *args, **kwargs): 
     self.request = kwargs.pop("request") 
     super(ContactForm, self).__init__(*args, **kwargs) 
     self.fields['contact_name'].label = "Your name:" 
     self.fields['contact_name'].initial = self.request.user.first_name 

ます。また、リクエストオブジェクトを渡すためにあなたのビューを更新する必要があります。 GETおよびPOSTリクエストのコードを更新することを忘れないでください。

if request.method == 'POST': 
    form = ContactForm(data=request.POST, request=request) 
    ... 
else: 
    # GET request 
    form = ContactForm(request=request) 

最後に、リクエストをフォームに渡すと、ビューに密接に結合されています。代わりにuserをフォームに渡す方が良いかもしれません。これにより、ビューとは別にフォームをテストするのが容易になります。フォームを変更する場合は、ビューを更新することも忘れないでください。

+0

恐ろしい!私を助けてくれてありがとう!できます! 私の見解でしなければならなかったことは、 form_class = ContactForm(request = request) #新しいロジック! if request.method == 'POST': フォーム= ContactForm(data = request.POST、request = request) 私は以前に持っていたものなら、フォーム= ContactFrom(...)を変更しなければなりませんでした。理由は分かりませんが、現在は動作します:/:D –

+0

これはビューの最初の行に間違いがあるためです。これは 'form_class = ContactForm'でなければなりません。このような関数ベースのビューでは、その行を完全に削除し、代わりに 'form = ContactForm(data = request.POST、request = request')を使う方がはっきりしていると思います。 – Alasdair

0

をいただければ幸いです:

ここ

は、私は、フォームを呼ぶ私のviews.pyであり、 ビュー:あなたが持っている

def ContactsView(request): 
    form_class = ContactForm(request=request, 
          initial={'contact_name': request.user.first_name}) 
    ... 
関連する問題