如果用户通过身份验证,则不显示表单中的字段

时间:2015-12-03 10:00:32

标签: python django

如果用户经过身份验证,我不想显示一个表单字段。

我试过if not request.user.is_authenticated():  但它不起作用。

def create_event(request):
    if not request.user.is_authenticated():
        CreateEventForm.base_fields['owner_email'] = forms.EmailField(required=True)
    event_form = CreateEventForm(request.POST or None, prefix='event')
    context = {
        'event_form': event_form,
    }
    if event_form.is_valid():
        event = event_form.save(commit=False)
        if request.user.is_authenticated():
            event.registered_owner = request.user
        else:
            event.owner_email = event_form.cleaned_data.get('owner_email')
        event = event_form.save()
        return HttpResponseRedirect('/event-%s' %event.id)
    return render(request, 'create_event.html', context)

form.py

中的表单
class CreateEventForm(forms.ModelForm):
    class Meta:
        model = Event
        fields = ['title', 'description', 'location', 'duaration', 'private']

1 个答案:

答案 0 :(得分:4)

你永远不应该修改base_fields;这是一个类属性,所以一旦你向它添加了一些东西,它就会出现在所有表单实例中,直到你明确删除它为止。

相反,将此逻辑移到表单本身的__init__方法中。

class CreateEventForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        is_authenticated = kwargs.pop('is_authenticated', False)
        super(CreateEventForm, self).__init__(*args, **kwargs)
        if is_authenticated:
            self.fields['owner_email'] = forms.EmailField(required=True)

现在在您的视图中,您需要将该参数传递给表单:

event_form = CreateEventForm(request.POST or None, prefix='event', is_authenticated=request.user.is_authenticated())