django objects.all()方法问题

时间:2010-05-26 19:00:17

标签: django django-models

我在一个视图/页面中使用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服务器之后,我可以看到新添加的公司名称

感谢您的帮助......

5 个答案:

答案 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 %}