2017-05-14 35 views
2

我試圖創建一個簡單的窗體,通過詢問窗體中的ID來拉起記錄。如何在django表單中包含id字段?

views.py

class Bill(models.Model): 
    """ 
    Represents a single purchase made by a customer at a business. 
    """ 
    business = models.ForeignKey(Businesses) 
    customer = models.ForeignKey(User, blank=True, null=True) 
    charge = models.ForeignKey(Charge, blank=True, null=True) 
    amount = models.IntegerField(verbose_name='Purchase amount (in cents)', 
           validators=[MinValueValidator(0)]) 
    tip = models.IntegerField(verbose_name='Tip amount (in cents)', 
           validators=[MinValueValidator(0)]) 
    comments = models.CharField(max_length=255, blank=True, null=True) 
    timestamp = models.DateTimeField(auto_now_add=True) 

forms.py

從Django的進口形式 從django.forms進口的ModelForm 從transactions.models進口賬單

class BillSelectForm(ModelForm): 
    class Meta: 
     model = Bill 
     fields = ('id',) 

views.py

@login_required(login_url='/sign-in/') 
def select_bill(request): 
    """ 
    Finds a bill based on its ID number. 
    """ 
    if request.method == 'POST': 
     form = BillSelectForm(request.POST) 
     if form.is_valid(): 
      pass 
      # look up db for id number 
      # go to bill view page if id found AND bill not paid 
      # go back to same page and create message saying wrong bill 

    else: 
     form = BillSelectForm() 

    return render(request, 'bill_select.html', {'form': form}) 

然而,在模板上,當我使用{{ form.as_p }},我看到什麼都沒有。思考?

回答

2

這種情況下,您不應該使用ModelForm。 Fazil已經就主要關鍵是什麼以及爲什麼不應該嘗試更新它給出了很好的答案。但這就是一種模型形式。

另一方面,在某些情況下,客戶被要求提及'參考號碼',這樣的參考號碼通常是主鍵。所以你的情況最簡單的解決方法是使用一個簡單的表格

class BillSelectForm(forms.Form): 
    pk = forms.IntegerField() 

然後

if request.method == 'POST': 
    form = BillSelectForm(request.POST) 
    if form.is_valid(): 
     bill = Bill.objects.get(form.cleaned_data['pk']) 

else: 
    form = BillSelectForm() 
+0

謝謝,這就是我一直在尋找的!因爲我們沒有指定一個Model,所以我認爲該類應該從'forms.Form'繼承,因爲'ModelForm'給出了一個'ValueError'。 – halsdunes

+0

對不起,錯字。感謝您指出。與您的項目一切順利 – e4c5

+0

謝謝e4c5! :) – halsdunes

1

ID是用於在Django模型的自動添加主鍵字段,僅當主鍵不是在模型中設置。該字段不能爲現有對象修改,甚至不能爲新的對象創建。 即使我們試圖修改它,一個新的對象將與舊的一起創建。最好將它用作特定對象的引用,而不是字段參數。

從文檔:

primary_key

如果真,這個字段是模型的主鍵。

如果您沒有爲模型中的任何字段指定primary_key = True,那麼Django會自動添加一個IntegerField來保存主鍵,因此您不需要在任何字段上設置primary_key = True,除非您想要覆蓋默認的主鍵行爲。有關更多信息,請參閱自動主鍵字段。

主鍵字段是只讀。如果您更改現有對象上主鍵的值並保存它,則會在舊對象旁邊創建一個新對象。

您可以使用ID字段模板這樣,。 {{object.auto_id}}

你爲什麼要在窗體ID字段?

+0

感謝您的答覆!我想要做的事實質上是讓用戶輸入Bill記錄的ID來找到它,而不是使用其他屬性 - 它基本上是一個只使用id值進行搜索的搜索框。 – halsdunes

+0

哈這就是我認爲,當我看到這個評論之前鍵入我的答案:) – e4c5

+0

如果是這樣的話,那麼@ e4c5已經給出了相同的很好的演示..試試.. – zaidfazil

相關問題