Why is my Django modelformset always invalid when I use a custom model manager?

After cutting my code to a minimum, it still doesn't work. I always get a hint:

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

Here's what my forms look like:

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)

and my view is as follows:

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 my template I do 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%}

Here it is. I have no clue where to look next. Maybe I'll do it wrong? At least I'm sure that for some reason I missed the important part of how forms work ... if someone can help me.


, - . , , Item2, , . Item2 , . : (, - ) modelfields, , ?

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')

edit2:
, : , - model.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)  

i

#public=PublicItemManager  

.

4:
, : - , , ?

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

django-docs . , django "" , _default_manager. : http://docs.djangoproject.com/en/1.2/topics/db/managers/#controlling-automatic-manager-types

:

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)
0

Source: https://habr.com/ru/post/1791065/


All Articles