gpt4 book ai didi

django - 当我使用自定义模型管理器时,为什么我的 Django modelformset 总是无效?

转载 作者:行者123 更新时间:2023-12-03 05:00:09 30 4
gpt4 key购买 nike

将我的代码精简到最少后,它仍然无法工作。我总是得到提示:

(Hidden field id) Select a valid choice. That choice is not one of the available choices.

这就是我的表单的样子:

class ChangeItemForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(ChangeItemForm, self).__init__(*args, **kwargs)
for key in self.fields:
self.fields[key].required = False
class Meta:
model = Item
fields = ('name','tags','no')

ChangeItemFormset=modelformset_factory(Item,extra=0,form=ChangeItemForm)

我的观点如下:

def manage_view(request):

if request.method=='POST':
itemforms=ChangeItemFormset(request.POST,
queryset=Item.objects.filter(creator=request.user))
else:
itemforms=ChangeItemFormset(queryset=Item.objects.filter(creator=request.user))

messages.info(request,str(itemforms.is_valid())) #always prints False

context=RequestContext(request)
context.update({'formset':itemforms,
})
return render_to_response('sonitem/test_forms.html',context)

在我的模板中我这样做:

<form action="." method="post" name="upload_image">
<button type="submit" name="action" value="change">change</button>
{%for form in formset.forms%}
{{form}}
{%endfor%}
{{formset.management_form}}
{%csrf_token%}
</form>
messages:
{%for message in messages%}
<div>{{message}}</div>
{%endfor%}

就是这样。我不知道该去哪里进一步寻找。也许我做错了?至少我确信我不知何故错过了表单集如何工作的一个重要部分...如果有人可以帮助我。

编辑:
看起来它与我的模型项目有某种关系。刚刚制作了一个新的简化模型 Item2,并且此代码完全按照预期工作。 Item2 只有上面表格中的字段。返回项目:为什么(更重要的是 - 如何)不在表单集中的模型字段会影响表单集验证?

Item2 模型,正在运行的模型:

class Item2(models.Model):
name=models.CharField(max_length=50)
tags=TagField()
no=models.IntegerField(blank=True,null=True)
creator = models.ForeignKey(User, related_name='creator')

编辑2:
我想我已经圈出了导致麻烦的原因:我已经定义了一个默认的模型管理器,它正在寻找一个状态 - 这是一个 models.IntegerField。一旦我将其放入类中,它就会停止工作并准确地传递上面的错误消息。Item 模型看起来有点像这样:

class Item(models.Model):
PRIVATE_STATUS=1
PUBLIC_STATUS=2
RELEASED_STATUS=3
STATUS_CHOICES=((PRIVATE_STATUS ,'private'),
(PUBLIC_STATUS ,'public' ),
(RELEASED_STATUS,'released'))

status = models.IntegerField(choices=STATUS_CHOICES,default=PRIVATE_STATUS)

public = PublicItemManager()
objects = models.Manager()

name=models.CharField(max_length=50)
tags=TagField()
no=models.IntegerField(blank=True,null=True)
file=models.FileField()
creator = models.ForeignKey(User, related_name='creator')
status=models.IntegerField(blank=True,null=True)

所以我必须扩展我上面的问题。是否可以在模型中使用状态(这绝对是必填字段)并仍然使用表单集?表单集仅用于编辑,不可用于创建项目。而且它总是预先填充,不可能有空的状态字段。

我仍然不明白表单中不存在的字段如何会阻碍其验证。顺便说一句,如果我只使用 ChangeItemForm,则不会。

编辑3:
这是管理器,被精简为最简单的版本,造成了麻烦:

class PublicItemManager(models.Manager):
def get_query_set(self):
return super(PublicItemManager,
self).get_query_set().filter(status=self.model.PUBLIC_STATUS)

当我

#public=PublicItemManager  

一切都很顺利。

编辑4:
哦,顺便说一句:当我让查询集与对象管理器一起使用时,为什么公共(public)管理器会影响任何验证?

queryset=Item.**objects**.filter(creator=request.user)  

最佳答案

在研究了 django-docs 很长一段时间后,我找到了解决方案。看起来在某些情况下 django 创建的“自动”管理器不是 _default_manager。文档在这里:http://docs.djangoproject.com/en/1.2/topics/db/managers/#controlling-automatic-manager-types

这是工作 Manager 的代码:

class PublicItemManager(models.Manager):  

#this is the important line:
use_for_related_fields = True

def get_query_set(self):
return super(PublicItemManager,self).get_query_set().filter(status=self.model.PUBLIC_STATUS)

关于django - 当我使用自定义模型管理器时,为什么我的 Django modelformset 总是无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4950196/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com