查询集在 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 [重复]
为啥 python 模块在 shell 中工作而不在脚本中工作?
GeoSpatial 查询在 mongo shell 中工作,但在 C# 驱动程序中没有过滤