In Django admin, can I require fields in a model but not when it is inline?

Sure. Just define a custom form, with your required field overridden to set required=True, and use it in your admin class.

from django import forms

class MyForm(forms.ModelForm):
    required_field = forms.CharField(required=True)

    class Meta:
        model = MyModel

class MyAdmin(admin.ModelAdmin):
    form = MyForm


class MyInlineAdmin(admin.ModelAdmin):
    model = MyModel

So here MyAdmin is using the overridden form, but MyInlineAdmin isn't.


While Daniel Roseman's answer works, it's not the best solution. It requires a bit of code duplication by having to re-declare the form field. For example, if you had a verbose_name on that field, you would also have to add label='My verbose_name already set on model' to the CharField line, since re-declaring the whole field basically erases everything set on your model for that field.

The better approach is to override the form's __init__ method and explicitly set field.required to True or False there.

class MyModelForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(MyModelForm, self).__init__(*args, **kwargs)

        self.fields['myfield'].required = True