使表单字段仅对特定用户是强制性的

问题描述

是否可以为特定用户在模板中设置必填或非必填的表单字段?我有一个字段,除管理员外,其他所有人都必须填写。

我的理解是不可能,因为null=False,blank=False中的model.py对字段的所有实例均有效。我错了吗?

编辑-添加代码

models.py

class Work(models.Model):
    [...]
    title = models.CharField(max_length=200) # max_length = required
    [...]

class Event(models.Model):
    [...]
    repertoire = models.ManyToManyField(Work,blank=True)
    [...]

forms.py

from .models import Work,Event
class EventForm(forms.ModelForm):

    required_css_class = 'required'

    class Meta:
        model = Event
        fields = [
            [...]
            'repertoire',[...]
                    }
    def __init__(self,*args,**kwargs):
        super(EventForm,self).__init__(*args,**kwargs)

views.py

from .forms import EventForm,@never_cache
def event_create_view(request):
    active_user = request.user
    form_event = EventForm(request.POST or None,initial={'submitted_by' : active_user.profile.id})

    if request.method == "POST" and form_event.is_valid():

        this_event = form_event.save()
        return redirect('event-edit',id=this_event.id)

    else:
        messages.error(request,form_event.errors)

    context = {
            'form_event': form_event,}

template.html

<form id="eventForm" action='.' enctype="multipart/form-data" method='POST'>
[...]
{{ form_event.repertoire }}
[...]
    <input class="button" type='submit' value='Continue ->' />

</form>

解决方法

您可以将某些用户设为必填字段。例如,通过添加一个额外的参数:

from .models import Work,Event

class EventForm(forms.ModelForm):
    required_css_class = 'required'

    class Meta:
        model = Event
        fields = [
            # …
            'repertoire',# …
        ]
    def __init__(self,*args,repertoire_required=True,**kwargs):
        super(EventForm,self).__init__(*args,**kwargs)
        self.fields['repertoire'].required = repertoire_required

然后在视图中,根据登录用户是否为is_admin的事实来指定参数:

from .forms import EventForm
from django.contrib.auth.decorators import login_required

@never_cache
@login_required
def event_create_view(request):
    active_user = request.user
    if request.method == 'POST':
        form_event = EventForm(
            request.POST,repertoire_required=not active_user.is_superuser,initial={'submitted_by' : active_user.profile.id }
        )
        if form_event.is_valid():
            this_event = form_event.save()
            return redirect('event-edit',id=this_event.id)
        else:
            messages.error(request,form_event.errors)
    else:
        form_event = EventForm(
            request.POST,repertoire_required=not active_user.is_superuser
        )
    context = {
        'form_event': form_event,}
    # …