2017-12-14 20 views
-1

私はコンテキストプロセッサを使用してプロジェクトで基本テンプレートにフォームをレンダリングしてフォームが正常に動作するように見えますが、投稿時にdjangoコンテキストプロセッサのフォームが表示されない

私はこのアプローチを以前は他のプロジェクトで使っていましたが、うまくいきましたが、今は何が起こったのか、どうしてそういうのか理解できません。ここで

は私のforms.pyです:

from django import forms 

class VersionSelectorForm(forms.Form): 
    mode = forms.ChoiceField(widget=forms.RadioSelect(), 
          choices=(('live', 'Live'), ('history', 'History')), 
          initial='live', 
          required=True, 
          help_text='Required') 
    date = forms.DateField(widget=forms.TextInput(attrs={'class': 'datepicker'}), 
          required=True, 
          help_text='required') 

    def clean(self): 
     cleaned_data = super(VersionSelectorForm, self).clean() 
     mode = cleaned_data.get('mode') 
     date = cleaned_data.get('date') 

     if mode == 'history' and not date: 
      msg = 'Date should be picked if \'History\' mode selected' 
      self.add_error('date', msg) 

view.py

from django.shortcuts import redirect 
from .forms import VersionSelectorForm 

def select_version(request): 
    if request.method == "POST": 
     form = VersionSelectorForm(request.POST) 
     if form.is_valid(): 
      print('I am valid') 
      mode = form.cleaned_data["mode"] 
      date = form.cleaned_data["date"] 
      if mode == "History": 
       request.session['selected_date'] = date 
      else: 
       request.session['selected_date'] = None 
    else: 
     form = VersionSelectorForm() 
    return redirect(request.META['HTTP_REFERER']) 

context_processors.py

from .forms import VersionSelectorForm 

def VersionSelectorFormGlobal(request): 
    return {'version_selector_form': VersionSelectorForm()} 

urls.py:base.htmlから

from django.contrib import admin 
from diagspecgen import views 

urlpatterns = [ 
    url(r'^admin/', include(admin.site.urls)), 
    url(r'^select_version/$', views.select_version, name='select_version'), 
] 

スニペット:settings.py

<section><div> 
      <form method="post" action="{% url 'select_version'%}"> 
       {% csrf_token %} 
       {{ version_selector_form.as_p }} 
       <button type="submit">Submit</button> 
      </form> 
     </div></section> 

そしてもちろん、私が追加した'diagspecgen.context_processors.VersionSelectorFormGlobal'にcontext_processorsリスト。

事前にお手数をお掛けしてありがとうございます。

+0

をそれは常にリダイレクトします。フォームが有効かどうかにかかわらず、常にリダイレクトされます。 –

+0

@DanielRosemanはあなたの返事Denielに感謝します。この事件についてもう少し詳しく説明できますか?理由は、なぜ私は尋ねているのは、このアプローチが別のプロジェクトで行われたことです。唯一の違いは、フォームがMetaクラスのモデルから直接フォームに構築されていることです。今、変なことが起こっています。 – Michael

+0

説明するものは何もありません。ビューの最後にはリダイレクトがあり、他の場所にはリターンはありません。したがって、リダイレクトは常に呼び出されます。これはモデルやメタとは関係ありません。 –

答えて

0

コンテキストプロセッサを使用してフォームをレンダリングするのではなく、djangoショートカットrenderの機能に渡すべきです。あなたはこのような何か行うことができます

def select_version(request): 
    if request.method == "POST": 
     form = VersionSelectorForm(request.POST) 
     if form.is_valid(): 
      print('I am valid') 
      mode = form.cleaned_data["mode"] 
      date = form.cleaned_data["date"] 
      if mode == "History": 
       request.session['selected_date'] = date 
      else: 
       request.session['selected_date'] = None 
    else: 
     form = VersionSelectorForm() 
    return render(request, 'template.html', {'form': form}) 

をドキュメントにインポートfrom django.shortcuts import render

リンクを忘れないでください:それはあなたがあなたのビューで何をすべきかだからhttps://docs.djangoproject.com/en/2.0/topics/forms/#the-view

+0

Unfortunatellyこれは動作しません、私は基本的なテンプレートにフォームをレンダリングしようとしていますが、そこからレンダリングは適切ではありません。最も奇妙なスタッフは、絶対に同じコードが他のプロジェクトでうまく働いたということです。唯一の違いは、ここのフォームはモデルに関連していないということです。 – Michael

+0

よく、あなたがフォームを表示したい場合は、それをレンダリングする必要があります); – oyo

+0

@DanielRosemanは、彼のコメントでは、常にあなたがリダイレクトしている場合、ページにエラーを表示することはできません。 – oyo