仅对特定用户强制填写表单字段
Making a form field compulsory only for specific users
是否可以在模板中为特定用户设置强制或非强制的表单域?我有一个字段,我想对除管理员以外的所有人都是强制性的。
我的理解是不可能的,因为model.py
中的null=False, blank=False
对字段的所有实例都有效。我错了吗?
编辑 - 添加代码
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<b>, repertoire_required=True</b>, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['repertoire']<b>.required = repertoire_required</b>
在视图中,我们然后根据事实指定参数,例如登录用户是 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,
<b>repertoire_required=not active_user.is_superuser</b>,
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,
<b>repertoire_required=not active_user.is_superuser</b>
)
context = {
'form_event': form_event,
}
# …
是否可以在模板中为特定用户设置强制或非强制的表单域?我有一个字段,我想对除管理员以外的所有人都是强制性的。
我的理解是不可能的,因为model.py
中的null=False, blank=False
对字段的所有实例都有效。我错了吗?
编辑 - 添加代码
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<b>, repertoire_required=True</b>, **kwargs):
super(EventForm, self).__init__(*args, **kwargs)
self.fields['repertoire']<b>.required = repertoire_required</b>
在视图中,我们然后根据事实指定参数,例如登录用户是 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,
<b>repertoire_required=not active_user.is_superuser</b>,
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,
<b>repertoire_required=not active_user.is_superuser</b>
)
context = {
'form_event': form_event,
}
# …