【问题标题】:How to create a very simple search view for one column of mysql data in Django?如何在Django中为一列mysql数据创建一个非常简单的搜索视图?
【发布时间】:2014-12-05 01:56:15
【问题描述】:

我四处搜索,发现大多数都指向由 Julien Phalip 创建的搜索:http://julienphalip.com/post/2825034077/adding-search-to-a-django-site-in-a-snap

答案似乎也在这里:Very simple user input in django

但是,我对 Django 非常陌生,想创建一个视图,让我真正了解正在发生的事情,所以我一直在阅读官方 Django 和 Tango with Rango 教程,但我没有看到一个简单的例子来说明我是什么试图理解一个简单的表单搜索。我的主要问题是为什么在示例中使用 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?我插入了这段代码,它似乎确实有效,但我就是不明白为什么。

其次,如何显示关联的外键类以及主类“硬件”搜索结果? ForeignKey 关联是否也提供了显示该数据的快捷方式?

谢谢!

【问题讨论】:

    标签: python mysql django


    【解决方案1】:

    W3 对 POST 与 GET here 进行了出色的介绍。关于为什么有人可能使用 POST 或 GET,以及他们的角色应该是什么,有很多话要说。您可能对用户(浏览器)角度的差异更感兴趣。在浏览器中使用 POST 和 GET 的最大区别在于 GET 请求将显示 URL 中的参数。将您的表单更改为 GET 以亲自查看。用户将被带到:

    /hardware_search.html?textfield=Upload%20text

    与表单操作为 POST 时它们被带到的位置相反:

    /hardware_search.html

    textfield 字段的值仍会发送到服务器,但在 URL 中不可见。

    在表单提交中 GET 和 POST 的行为还有很多其他差​​异。我强烈建议您阅读 W3 的介绍。

    【讨论】:

    • 感谢 Alex 这对我来说很有意义。由于我当前的数据不敏感,我应该可以公开该信息,但最终可能不得不切换,因为我计划稍后进行一些验证。
    【解决方案2】:

    你是对的,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。

    【讨论】:

    • 谢谢丹尼尔,我仍在整理我希望如何呈现输出,所以看来我有多种方法可以做到这一点,所以感谢您提供的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 2011-04-18
    • 2015-01-18
    • 1970-01-01
    • 2021-10-27
    • 2014-12-17
    相关资源
    最近更新 更多