Why is my Django modelformset always invalid when i use a custom model manager? -
after stripping down code minimum, still not work. alway hint:
(hidden field id) select valid choice. choice not 1 of available choices.
this forms looks like:
class changeitemform(forms.modelform): def __init__(self, *args, **kwargs): super(changeitemform, self).__init__(*args, **kwargs) 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)
and view looks this:
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)
and in template this:
<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%}
thats it. don't have clue further. maybe wrong? @ least sure somehow missed important piece of how formsets work... if please me out.
edit:
looks it's somehow related model item. made new, simplified model, item2, , code worked should. item2 had fields in form above. item: why (and more important - how) can modelfields not in formset affect formset validation?
the item2 model, 1 working:
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')
edit2:
think have encircled causes trouble: have defined model manager default, looking status - models.integerfield. put class, stops working , delivers error message above. item model looks this:
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)
so have extend question above. possible use status (which required field) in model , still use formset? formset editing, not creating items. , always prepopulated, there no chance there empty status-field.
i still don't understand how field not in form can impede validation of it. and, way, if using changeitemform, not.
edit 3:
here manager, stripped down simple version causing trouble:
class publicitemmanager(models.manager): def get_query_set(self): return super(publicitemmanager, self).get_query_set().filter(status=self.model.public_status)
when
#public=publicitemmanager
everything runs smooth.
edit 4:
oh, , way: why public manager affecting validation, when have queryset working objects manager?
queryset=item.**objects**.filter(creator=request.user)
after studying django-docs quite while able find solution. looks in situations django creates "automatic" managers not _default_manager. docs here: http://docs.djangoproject.com/en/1.2/topics/db/managers/#controlling-automatic-manager-types
and here code working manager:
class publicitemmanager(models.manager): #this 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)
Comments
Post a Comment