2016-07-19 37 views
3

我是django的新手,我正在努力爭取更長的時間,並且在提交錯誤後不顯示所有數據。 在我的預訂健身課程的應用程序中,有一些顯示所選培訓數據的標題,還有一些字段用於輸入培訓參與者的數據,並有一個提交按鈕。提交後,當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中,當您在post中使用context = { 'training': training, 'form': form }呈現時,如果發生錯誤(表單無效),您只返回{ 'form' : form }

您應該返回training對象無論哪種方式,因爲它總是顯示:

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

除此之外,考慮使用Django的通用編輯觀點如FormViewCreateViewhttps://docs.djangoproject.com/en/1.9/ref/class-based-views/generic-editing/)。

+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) context ['training'] =訓練 返回上下文,但不起作用。你能給我一些指導嗎? – annlii

+0

您仍然需要實際查詢您想要的培訓項目。 'context ['training'] = Training.objects.get(pk = self.kwargs ['training_id'])'。 –

+0

感謝隊友,它完美的作品:) – annlii

相關問題