如何在Django中为一列mysql数据创建一个非常简单的搜索视图?
找遍了周围,发现大部分都指向一个由朱利安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协会是否也提供了显示该数据的捷径?
谢谢!
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的介绍。
你是对的,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。
谢谢丹尼尔我仍然在整理如何我想要的输出呈现,所以它似乎我有更多的方式来做到这一点,所以感谢信息。 – 2014-12-09 01:11:34
感谢Alex现在对我有意义。由于我目前的数据并不敏感,因此我可能会公开该信息,但可能必须最终切换,因为我打算稍后进行一些验证。 – 2014-12-09 01:09:50