2016-07-19 7 views
3

私はdjangoの初心者です。エラーが出てからすべてのデータを表示しないような形で長い時間苦労しています。 フィットネスクラスを予約する私のアプリケーションでは、選択したトレーニングのデータを表示するヘッダーのようなsthがあります。トレーニング参加者のデータを入力するフィールドもあり、送信ボタンがあります。 form.is_valid()がfalseのときに送信した後、選択したトレーニングのデータ、フィールドに入力されたデータ、間違って入力されたすべてのフィールドの検証情報など、同じページを表示したいと思います。フィールドに入力されたデータと検証情報は表示されますが、選択したトレーニングのデータは表示されません。私はこの状況を示すためにプリントスクリーンを付けます。django - form.is_valid()がfalseのときに、すべてのデータで同じページを返す方法

スクリーンショット:

enter image description here

views.py

class BookView(View): 
    """ 
    Booking page - getting data of trainings and 
    posting data of booking to db 
    """ 
    template_name = 'club/book.html' 
    form_class = BookingForm 

    def post(self, request, training_id): 
     form = self.form_class(request.POST) 
     if form.is_valid(): 
      form.save() 
      messages.success(request, 'Well done! Fitness Class has been booked for you. If you would like to cancel booked fitness class, please contact our office.') 
      return HttpResponseRedirect('/book/' + training_id) 
     else: 
      messages.error(request, 'Oh snap! Fill/correct all fields and try submitting again.') 
     return render(request, self.template_name, {'form': form}) 

    def get(self, request, training_id): 
     training = get_object_or_404(Training,pk = training_id) 
     form = self.form_class(instance=training) 
     context = {'training': training, 
        'form': form} 
     return render(request, self.template_name, context) 

book.html

{% extends 'club/base.html' %} 

{% block content %} 
{% load bootstrap %} 
<div> 
    <h4>Please input your details to book the following Fitness Class</h4> 
    <br></br> 
    <div class="training-context"> 
     <label>{{training.name}} {{training.training_date}} {{training.start_time}}</label> 
    </div> 
</div> 
<br></br> 
<form action=" " method="POST">{% csrf_token %} 
<div class="input-group"> 
{{form.first_name|bootstrap}} 
<p></p> 
{{form.last_name|bootstrap}} 
<p></p> 
{{form.email|bootstrap}} 
<p></p> 
{{form.phone|bootstrap}} 
</div> 
<input type="hidden" name="training" value={{training.id}}> 
<br></br> 
<a href=""><button type="submit" class="btn btn-primary">Submit</button></a> 
</form> 
</div> 

{% endblock %} 

forms.py

class BookingForm(forms.ModelForm): 
    class Meta: 
     model = Booking 
     fields = '__all__' 

models.py

class Training(models.Model): 
    """Class for plan training""" 
    STATE = (
     ('A', 'Active'), 
     ('I', 'Inactive'), 
    ) 
    name = models.ForeignKey('TrnDesc') 
    instructor = models.ForeignKey('Instructor') 
    start_time = models.TimeField(blank=True) 
    end_time = models.TimeField(default='00:00:00') 
    availability = models.IntegerField(default=15) 
    state = models.CharField(max_length=1, choices=STATE, default='A') 
    training_date = models.DateField(default=date.today) 
    def __str__(self): 
     return self.name.name 

class Booking(models.Model): 
    """Data of people which book fitness classes""" 
    first_name = models.CharField(max_length=50) 
    last_name = models.CharField(max_length=50) 
    email = models.CharField(max_length=50) 
    phone = models.CharField(max_length=10) 
    training = models.ForeignKey('Training') 
    def __str__(self): 
     return self.training.name.name 

urls.py

urlpatterns = [ 
    url(r'^$', HomePageView.as_view(), name='homepage'), 
    url(r'^book/(?P<training_id>\d+)/$', BookView.as_view(), name='book'), 
    ] 
+0

['FormView']を使用してください(https://docs.djangoproject.com/es/1.9/ref/class-based-views/generic-editing/#formview) – Gocht

答えて

1

getではcontext = { 'training': training, 'form': form }と表示されますが、postではエラー(フォームが無効な場合)の場合には{ 'form' : form }のみが返されます。それが常に表示されますよう

あなたは、trainingオブジェクトのいずれかの方法を返す必要があります:

if not form.is_valid(): 
    return render(request, self.template_name, { 'training': training, 'form': form }) 

は、それとは別に、このよう FormViewまたは CreateViewhttps://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/)としてDjangoの一般的な編集ビューを使用することを検討してください。

+0

ありがとう、私は 'トレーニング'を追加しました: – annlii

0

あなたがしている機能のために正しいクラスを使用する必要があります実装する。データベースにエンティティを作成しているので、CreateViewをサブクラス化する必要があります。これを済ませたら、ほとんどのロジックを削除し、get_context_dataを定義して関連するトレーニングオブジェクトを返すことができます。

+0

私はCreateViewを使用しようとしていますが、表示されるべき訓練の文脈を得ることに伴う問題。私のget_context_dataは次のようになります:def get_context_data(self、** kwargs): context = super(BookView、self).get_context_data(** kwargs) コンテキスト['training'] = Training コンテキストを返しますが動作しません。あなたは私にそれについていくつかの指針を与えることができますか? – annlii

+0

必要なトレーニング項目を実際に照会する必要があります。 'context ['training'] = Training.objects.get(pk = self.kwargs ['training_id'])'。 –

+0

ありがとう、それは完全に動作します:) – annlii

関連する問題