2017-05-31 80 views
0

我無法弄清楚爲什麼我的一個表單在提交時不保存也沒有轉發。Django表單不保存到數據庫也不會在POST後正確轉發

這是模型:

class Offer(models.Model): 
    """ local offers traveler to take her out based on the trips listed by traveler """ 
    local = models.ForeignKey(User, related_name='local_offers_excursion') 
    message = models.CharField(max_length=500) 
    trip = models.ForeignKey(Excursion, related_name='traveler_trip') 
    traveler_approval = models.BooleanField(blank=True) 

這是以下形式:

class OfferExcursionForm(forms.ModelForm): 
    def __init__(self, traveler=None, city=None, **kwargs): 
     super(OfferExcursionForm, self).__init__(**kwargs) 
     if traveler and city: 
      self.fields['trip'].queryset = Excursion.objects.filter(traveler=traveler) 
      self.fields['trip'].queryset = Excursion.objects.filter(city=city) 
    class Meta: 
     model = Offer 
     exclude = ('local', 'traveler_approval') 

這是其他相關的模型(遊覽):

class Excursion(models.Model): 
    """traveler lists his trips so local could see them and possibly offer to take him out""" 
    traveler = models.ForeignKey(User, related_name='traveler_lists_excursion') 
    city = models.ForeignKey(City, related_name='visited_city', blank=True, null=True) #Each excursion is connected to one City. 
    city_search_text = models.CharField(blank=True, max_length=300) 
    message = models.CharField(max_length=500)#message to all locals of that city "Hey good people of Edinburgh!" 
    date = models.DateField() 

    def __str__(self): 
     return self.traveler.first_name.title() + " " + self.traveler.last_name.title() + "'s trip to " + self.city.name + " on " + str(self.date) 

這是視圖:

def offerexcursion(request, username): 
    traveler = User.objects.get(username=username) 
    if request.method == 'POST': 
     offer_excursion_form = OfferExcursionForm(request.POST) 
     if offer_excursion_form.is_valid(): 
      offer = offer_excursion_form.save(commit=False) 
      offer.local = request.user 
      offer.traveler_approval = True 
      offer.save() 
      if 'next' in request.GET: 
       return redirect(request.GET['next']) 
     else: 
      print(offer_excursion_form.errors) 
    else: 

     offer_excursion_form = OfferExcursionForm(traveler=traveler, city=request.user.profile.city) 
    return render(request, '<app_name>/offerexcursion.html', {'offer_excursion_form':offer_excursion_form}) 

最後這是模板:

<h1>Offer an Excursion to a Traveler</h1> 

<form method="post" action="?next=/dashboard/" enctype="multipart/form-data"> 
      {% csrf_token %} 

    {{ offer_excursion_form|crispy }} 

    <input type="submit" value="Submit" class="btn btn-primary btn-lg "/> 

</form> 

一旦提交表單,沒有發售對象向前保存,它的形式,而不是再次的儀表板頁面。它轉發到這個鏈接:

http://127.0.0.1:8000/offerexcursion/<username>/?next=/dashboard/ 

代替:

http://127.0.0.1:8000/dashboard/ 

回答

2

你必須改變__init__方法的簽名。

def __init__(self, traveler=None, city=None, **kwargs): 

因此,當你有OfferExcursionForm(request.POST),它相當於OfferExcursionForm(traveler=request.POST)

可以傳遞數據作爲關鍵字參數:

if request.method == 'POST': 
    OfferExcursionForm(data=request.POST) 

然而,你可能想提供travelercity,否則表格將使用未經過濾的trip查詢集進行驗證。

if request.method == 'POST': 
    offer_excursion_form = OfferExcursionForm(traveler=traveler, city=request.user.profile.city, data=request.POST) 

最後,在這裏你的第二個查詢集替換第一個,這樣你就不會在traveler對其進行篩選。

if traveler and city: 
     self.fields['trip'].queryset = Excursion.objects.filter(traveler=traveler) 
     self.fields['trip'].queryset = Excursion.objects.filter(city=city) 

你可能想

if traveler and city: 
    self.fields['trip'].queryset = Excursion.objects.filter(city=city, traveler=traveler) 
相關問題