Muhammad Tahir
Muhammad Tahir

Reputation: 5184

How to set django many-to-many field to accept null

I am working on a python/django application. In my application there are 2 tables Store and Ad. That have many to many relation.

Class Store:
    ads = models.ManyToManyField(Ad, null=True, blank=True)

Class Store:
    ads = models.ManyToManyField(Ad)

I have tested it with both implementations given above but when i save my store without selecting an ad it gives me error:

ads: This field is required.

How can i set ads optional here???

View:

class StoreView(FormView):
form_class = StoreForm
success_url = "/"
template_name = 'store.html'

def __init__(self):
    super(StoreView, self).__init__()
    self.store = None

def get_form_kwargs(self):
    kwargs = super(StoreView, self).get_form_kwargs()
    kwargs['current_user'] = self.request.user
    if 'store_id' in self.kwargs:
        self.store = Store.objects.get(id=self.kwargs['store_id'])
        kwargs['instance'] = self.store
    kwargs['request'] = self.request
    return kwargs

def get_context_data(self, **kwargs):
    context = super(StoreView, self).get_context_data(**kwargs)
    context['store_info'] = self.store
    return context

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
    return super(StoreView, self).dispatch(*args, **kwargs)

def form_invalid(self, form):
    return super(StoreView, self).form_invalid(form)

def form_valid(self, form):
    self.object = form.save()
    return super(StoreView, self).form_valid(form)

Form:

class StoreForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
    self.fields['ads'] = forms.ModelMultipleChoiceField(
        queryset=Ad.objects.filter(type=13),
        widget=forms.CheckboxSelectMultiple,
        label='Ads associated with this store'
    )

def save(self, commit=False):
    store = super(StoreForm, self).save(commit=True)
    return store

class Meta:
    model = Store

Upvotes: 1

Views: 2905

Answers (1)

Rohan
Rohan

Reputation: 53386

add required=False in definition ads field in the form. When you override a field in model form, no attributes are inherited from the model. You have to add all constraints to it like max_length, required etc.

Upvotes: 2

Related Questions