djangodjango-formsdrydjango-queryset

Specifying default value for hidden ModelChoiceField (Django)


So let's say at the last minute (in the view) I decide I want to specify a default for a field and make it hidden, like so:

form.fields['coconut'] = forms.ModelChoiceField(
    label="", 
    widget=forms.HiddenInput(),
    queryset=swallow.coconuts.all(),
    initial=some_particular_coconut,
)

My question is this: Do I really need to specify queryset here? I mean, I already know, from initial, exactly which coconut I'm talking about. Why do I also need to specify that the universe of available coconuts is the set of coconuts which this particular swallow carried (by the husk)?

Is there a way I can refrain from specifying queryset? Simply omitting causes django to raise TypeError.

If indeed it is required, isn't this a bit damp?


Solution

  • The problem is that you're trying to set up a hidden ModelChoiceField. In order to have a Choice (dropdown, traditionally) it needs to know its Choices - this is why you give a queryset.

    But you're not trying to give the user a choice, right? It's a hidden input, and you're setting it from the server (so it gets POSTed back, presumably).

    My suggestion is to try to find a way around using the hidden input at all. I find them a bit hacky. But otherwise, why not just specify a text field with some_particular_coconut.id, and hide that? The model's only wrapping that id anyway.