2014-12-05 40 views
0

找遍了周圍,發現大部分都指向一個由朱利安Phalip創建一個搜索:http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap如何在Django中爲一列mysql數據創建一個非常簡單的搜索視圖?

而且答案似乎是在這裏:Very simple user input in django

但是我很新的Django和希望創建一個視圖,讓我真正理解正在發生的事情,所以我一直在用Rango教程瀏覽官方的Django和Tango,但是我沒有看到我想要了解的簡單表單搜索的簡單例子。我擁有的主要問題是爲什麼在示例中使用POST而不是GET?我認爲POST被用來在mysql中「創建」數據條目,而GET則用於查找/搜索數據條目?我是否錯過了使用一個和另一個的根本?

我有以下簡單的例子,從我的應用程序:

models.py

class hardware(models.Model): 
    text = models.CharField(max_length=200, unique=TRUE) 
    pub_date = models.DateTimeField(default=timezone.now) 
    def __unicode__(self): 
     return self.text 
class Barcode(models.Model): 
    hardware = models.ForeignKey(Hardware) 
    text = models.CharField(max_length=50) 
    pub_date = models.DateTimeField(default=timezone.now) 
    def __unicode__(self): 
     return self.text 

forms.py

class HardwareForm(forms.modelForm): 
    class Meta: 
     model = Hardware 
     fields = ['text'} 

views.py

def hardware_search(request): 
    if request.method == 'POST': 
     search_id = request.POST.get('textfield', None) 
     try: 
      hardwarename = Hardware.objects.get(text = search_id) 
      html = ("<H1>%s</H1>", hardwarename) 
      return HttpResponse(html) 
     except Hardware.DoesNotExist: 
      return HttpResponse("no such hardware found") 
    else: 
     return render(request, 'search.html') 

搜索。 html

<form method="POST" action="/hardware_search.html"> 
{% csrf_token %} 
<input type="text" name="textfield"> 

<button type="submit">Upload text</button> 
</form> 

我的問題是這是最簡單的方式來請求用戶輸入來搜索並生成搜索結果嗎?爲什麼使用POST?我插入這段代碼,它似乎工作,但我不明白爲什麼。

其次,我如何顯示asskociated外鍵類以及主類「硬件」搜索結果? ForeignKey協會是否也提供了顯示該數據的捷徑?

謝謝!

回答

0

W3對POST有很好的介紹vs GET here。爲什麼有人可能會使用POST或GET,以及他們的角色應該是什麼,還有很多要說的。您可能更感興趣的是與用戶(瀏覽器)角度的差異。在瀏覽器中使用POST和GET最大的區別是GET請求會在URL中顯示參數。更改您的表單以便親自查看。用戶將被帶到:

/hardware_search.html?textfield=Upload%20text

與之相對,在那裏它們被帶到當表單動作是POST:

/hardware_search.html

textfield字段的值仍發送給服務器,但在URL中不可見。

在表單提交中,GET和POST的行爲還有其他不同之處。我強烈建議您閱讀W3的介紹。

+0

感謝Alex現在對我有意義。由於我目前的數據並不敏感,因此我可能會公開該信息,但可能必須最終切換,因爲我打算稍後進行一些驗證。 – 2014-12-09 01:09:50

0

你是對的,POST不適合搜索表單。在這裏使用GET會更好。

另一個錯誤的是,根本不需要ModelForm,或者真的不需要任何類型的Django表單。你沒有進行任何驗證,你甚至沒有使用表單輸出,所以最好完全不用。這使得視圖如下所示:

def hardware_search(request): 
    query = request.GET.get('textfield', None) 
    if query: 
     try: 
      hardwarename = Hardware.objects.get(text = query) 
      html = ("<H1>%s</H1>", hardwarename) 
      return HttpResponse(html) 
     except Hardware.DoesNotExist: 
      return HttpResponse("no such hardware found") 
    else: 
     return render(request, 'search.html') 

並且您可以將表單操作更改爲GET。

+0

謝謝丹尼爾我仍然在整理如何我想要的輸出呈現,所以它似乎我有更多的方式來做到這一點,所以感謝信息。 – 2014-12-09 01:11:34

相關問題