【问题标题】:Making a form field compulsory only for specific users仅对特定用户强制填写表单字段
【发布时间】:2020-12-17 15:15:57
【问题描述】:

是否可以在模板中为特定用户创建一个强制或非强制的表单域?我有一个字段,我希望除管理员之外的所有人都必须填写。

我的理解是这是不可能的,因为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,
            }

模板.html

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

</form>

【问题讨论】:

  • 对于模型是的,但您可以更改表单以使其对某些用户强制执行。你能分享你的模型、视图和表单的(相关部分)吗?
  • @WillemVanOnsem 谢谢,我已将代码添加到我的问题中。

标签: django django-forms django-authentication


【解决方案1】:

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

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,
    }
    # …

【讨论】:

  • 太棒了,这太简洁了,很有道理。如果您不介意,还有一个问题:使用form_event = EventForm(request.POST or None(我的表单)与if request.method == 'POST': form_event = EventForm [...] else(您的表单)有什么区别?
  • @HBMCS: 如果request.POST QueryDictrequest.POST or None 将传递None。但这本身并不意味着它不是POST 请求,因为一些POST 请求可以为空。几个月前我写了一篇关于这个的文章:github.com/hapytex/django-antipatterns/blob/master/antipatterns/…
猜你喜欢
  • 2018-09-07
  • 2020-06-05
  • 2015-10-24
  • 2013-08-10
  • 1970-01-01
  • 2013-06-09
  • 2011-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多