我在一个视图/页面中使用django的MyModelClass.save()方法保存了一个项目后,在另一个视图中我使用MyModelClass.objects.all()列出MyModelClass中的所有项目但是新添加的项目总是在新页面。我正在使用 django 1.1
我正在使用mysql
middleware setting
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.middleware.locale.LocaleMiddleware',
)
我的模特:
class Company(models.Model):
name = models.CharField(max_length=500)
description = models.CharField(max_length=500,null=True)
添加公司视图
def addcompany(request):
if request.POST:
form = AddCompanyForm(request.POST)
if form.is_valid():
companyname = form.cleaned_data['companyname']
c = Company(name=companyname,description='description')
c.save()
return HttpResponseRedirect('/admins/')
else:
form = AddCompanyForm()
return render_to_response('user/addcompany.html',{'form':form},context_instance=RequestContext(request))
在此页面之后
在另一种观点中 我在另一个视图中调用了这个表单
class CompanyForm(forms.Form):
companies=((0,' '),)
for o in CcicCompany.objects.all():
x=o.id,o.name
companies+=(x,)
company = forms.ChoiceField(choices=companies,label='Company Name')
列出所有公司,但最近添加的公司缺失。
交易应该是成功的,因为在我重新启动apache服务器之后,我可以看到新添加的公司名称
感谢您的帮助......
答案 0 :(得分:3)
问题在于(您曾经在导入时)在表单声明中动态构建选项列表,但希望每次使用表单时都要对其进行修改。 Python无法正常工作。
请参阅此处了解有关选择的文档: http://docs.djangoproject.com/en/dev/ref/models/fields/#choices
但特别是这一点: “[你]你发现自己选择变得动态,你可能最好使用一个带有ForeignKey的正确数据库表。选择意味着静态数据不会有太大变化,如果有的话。”
类似适用于表格。也许你想要一个ModelForm和ModelChoiceField?
答案 1 :(得分:2)
您的CcicCompany.objects.all()
代码仅在首次解析Form类时运行一次。所以当然任何其他对象都不在此列表中。您可以使用表单的__init__
方法来实现此目的,因此每次生成表单时都会重新运行。您可以通过self.fields['field_name'].choices
答案 2 :(得分:2)
正如其他用户所指出的,选择是在您导入模块时创建的(仅一次),因此在第一次使用后它们不会得到更新。
您应该最有可能使用django.forms.ModelChoiceField来完成此任务。它需要一个查询集,并允许您自定义标签。
另一种方法是将代码包装在函数中,每次都返回一个新类。由于框架为您提供了ModelChoiceField
,因此它实际上不是很好的方法,但它是一个选项,因为python允许您返回本地定义的类。
答案 3 :(得分:0)
我猜你正在做类似以下的事情:
m = MyModelClass(foo='bar')
m.save()
或
MyModelClass(foo='bar').save()
或
kwargs = {'foo':'bar'}
MyModelClass(**kwargs).save()
也许共享一些代码可能会提供更多见解。
答案 4 :(得分:0)
好吧,我希望你发布更多代码(正如我在评论中提到的那样),所以我还在猜...
您使用的是TransactionMiddleware吗?第一个请求是否可能进行回滚而不是提交?
您使用的是哪个数据库后端? (如果是Sqlite,那么考虑使用PostgreSQL或MySQL,因为sqlite在并发连接方面效果不好)
请发布所有相关代码(完整课程,包括您的models.py中可能的经理,以及完整视图),也许其他人可以更轻松地帮助您。
<强>更新强>
您的代码:
companies=((0,' '),) for o in Company.objects.all(): x=o.id,o.name companies+=(x,)
很不寻常,而且你还不清楚你在模板中添加了什么。由于您正在创建一个元组元组,因此代码有点不寻常,但我在这里看不到错误。该bug必须在其他地方。 无论如何,我宁愿做那样的事情而不是创建元组:
视图:
companies = Company.objects.all()
return direct_to_template(.... {'companies': companies...} ...)
模板:
{% for company in companies %}
<!-- put an empty company at the top of the list for whatever reason -->
{% if forloop.first %}
<a href="{% url company_view "0" %}">whatever</a><br />
{% endif %}
<a href="{% url company_view company.id %}">{{ company.name }}</a><br />
{% endfor %}