查询集在 shell 中工作,但不在表单中

Posted

技术标签:

【中文标题】查询集在 shell 中工作,但不在表单中【英文标题】:queryset working in the shell but not in the form 【发布时间】:2015-11-19 15:19:43 【问题描述】:

我尝试实现一个允许用户查找特定广告的查询表单,我在 shell 中花了一些时间,所以我可以在 views.py 中编写函数,但是出现了问题,因为我在模板中没有得到任何结果.

models.py

from django.db import models
from user.models import User

class Ads(models.Model):
    name = models.CharField(max_length=30, unique=True, blank=False) #I added an object called 'apple'

    def __str__(self):
        return self.name

class Offer(models.Model):
    publisher = models.ForeignKey(User)
    content = models.TextField()
    ads = models.ManyToManyField(Ads)

    def __str__(self):
        return self.content

forms.py

class SendOfferForm(forms.ModelForm):
    courses = forms.ModelChoiceField(queryset=Course.objects.all())
    class Meta:
        model = Offer
        fields = ('ads', 'content')
        labels = 
            'content': _("write your ads here"),
            'ads': _("ads-number"), # TODO the label does'nt show up in the template
        

class QueryForm(forms.ModelForm):
    ads = forms.ModelChoiceField(queryset=Course.objects.all(), required=False)
    def __init__(self, *args, **kwargs):
        super(QueryForm, self).__init__(*args, **kwargs)
        self.fields['content'].required = False
    class Meta:
        model = Offer
        fields = ('ads', 'content')

views.py

def search(request):
    try:
        logged_user = get_logged_user_from_request(request)
    except:
        pass
    if request.method=='GET':
        form = QueryForm(request.GET)
        results = None
        if form.is_valid():
            query_content = request.GET.get('id_content')
            if query_content:
                results = Offer.objects.filter(content__contains=query_content)
    else:
        form = QueryForm()
    return render(request, 'offers/search.html', locals())

模板

    <form id="login_form" method='GET' action="% url "search" %"> 
        % csrf_token %
         form.as_p 
            <p>
                <input type="submit" value="chercher" />
            </p>        
    </form>

搜索.html

% if results %
% for result in results %
    <div class="result">
        <p> result.content </p>
        <p> result.cours.name </p>
    </div>

% empty %

    <p>No ads, sorry</p>  <!--TODO this is always showing up -->

% endfor %
% elif results == None %
<p>No ads, sorry</p>
% endif %

最后,这是我在 shell 中编写的查询

Offer.objects.filter(content__contains='apple')
[<Offer: a>, <Offer: a>]

这在这里工作,但是

results = Offer.objects.filter(content__contains='apple')
result = result[0]
result
<Offer: a>     # the user is called 'a', I was a bit lazy to create a real exemple of user ^^

res.content
'I'm an ads called apple'
res.ads
<django.db.models.fields.related.create_many_related_manager.<locals>.ManyRelatedManager object at 0x7fdf5231deb8>
res.ads.name
print(res.ads.name)
None

通常,当我搜索“苹果”时,我可以看到内容,但我的模板中没有出现任何内容。另外,我可以看到我什至无法获得广告的名称。根据管理员的说法,这不是无,而是苹果。我负责编写以下代码来保存 m2m 关系的对象:

    if offerform.is_valid():        
        sent = True
        offer = offerform.save(commit=False)
        offer.publisher = User.objects.get(id=logged_user.id)
        offer.save()
        offerform.save_m2m()

【问题讨论】:

【参考方案1】:

您不应使用locals() 将上下文返回到模板。在您的情况下,您的form.is_valid() 可能是False,然后results 保持为None。此外,如果其他人试图阅读您的代码,除非他们通过整个视图方法,否则他们无法弄清楚您的上下文中的内容。

【讨论】:

顺便说一句,我不确定你为什么要为你的表单使用GET 方法。通常POST 是要走的路。 我用 render(request, 'offers/search.html', 'form': form, 'results': results) 改变了它,但它没有改变任何东西:( 您可以打印/调试并查看results 是否为空吗?你的results 可能是None 我将请求方法更改为 POST,并在函数开头分配了结果 + 1000 不使用 locals()。在您的视图中添加一些打印语句。 if form.is_valid() print "valid form".... else print form.errors ....

以上是关于查询集在 shell 中工作,但不在表单中的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell MDB 查询 - 脚本在 Access 中工作,不在 PowerShell [重复]

FROM中的子查询不在Oracle SQL中工作

为啥 python 模块在 shell 中工作而不在脚本中工作?

GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤

GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤

Django中的Send_mail,在shell中工作,在本地工作,不在视图中