2012-04-04 47 views
0

2类用户存在投资者和管理者。一些用户(投资者)应该能够提出投资者类型,其他人(经理)不应该......我有一种形式。 UserInfoForm。我只是想知道是否有一种简单的方法可以排除那些经理用户无法填写该字段。如何排除[vanilla django]表单中的字段?

在我的模板中,我成功设法排除了管理者查看investor_type字段的情况。但是在提交他们的UserInfoForm后,在模板中出现:investor_type This field is required.

有什么方法可以放,必填=只对投资者有效吗?

class UserInfoForm(forms.Form): 
    choices = (('0', "Foundation"), ('1', "Financial/Bank"), ('2', "Pension"), ('3', "Endowment"),\ 
       ('4', "Government Pension"), ('5', "Family Office"), ('6', "Insurance Co."),\ 
       ('7', "Corporation"), ('8', "Fund of Funds"), ('9', "Fund Manager"), ('10', "Asset Manager"), ('11', "Fundless Sponsor")) 

    first_name = forms.CharField(widget=forms.TextInput(attrs={'class':'input-text'}), max_length=30) 
    last_name = forms.CharField(widget=forms.TextInput(attrs={'class':'input-text'}), max_length=30) 
    email = forms.EmailField(widget=forms.TextInput(attrs={'class':'input-text'})) 
    about = forms.CharField(widget=forms.Textarea(attrs={'class':'input-text'}), required=False) 
    country = forms.CharField(max_length=50, widget=forms.Select(choices=countries.COUNTRIES)) 
    avatar = forms.ImageField(required=False) 
    investor_type = forms.CharField(max_length=4, widget=forms.Select(choices=choices)) 


def save(self, user, type): 
    if type == 'manager': 
     profile = ManagerProfile.objects.get(user=user) 
    else: 
     profile = InvestorProfile.objects.get(user=user) 
     # // Tried this... 
     if profile.investor_type != self.cleaned_data['investor_type']: 
      profile.investor_type = self.cleaned_data['investor_type'] 
      profile_edited = True 
     # // Failed 
    user_edited = False 
    if user.first_name != self.cleaned_data['first_name']: 
     user.first_name = self.cleaned_data['first_name'] 
     user_edited = True 
    if user.last_name != self.cleaned_data['last_name']: 
     user.last_name = self.cleaned_data['last_name'] 
     user_edited = True 
    if user.email != self.cleaned_data['email']: 
     user.email = self.cleaned_data['email'] 
     user_edited = True 
    if user_edited: 
     user.save() 
    profile_edited = False 
    if profile.about != self.cleaned_data['about']: 
     profile.about = self.cleaned_data['about'] 
     profile_edited = True 
    if profile.country != self.cleaned_data['country']: 
     profile.country = self.cleaned_data['country'] 
     profile_edited = True 
    if profile_edited: 
     profile.save() 
    if self.cleaned_data['avatar']: 
     avatar = self.cleaned_data['avatar'] 
     avatar.name = user.username + '.' + avatar.name.split('.')[-1] 
     profile.avatar.save(avatar.name, avatar) 

我试过investor_type = forms.CharField(max_length=4, required=False, widget=forms.Select(choices=choices), initial='0'),没有工作。

Views.py:试图在视图内=失败。

@login_required   
def edit_profile(request, profile_type): 
    if profile_type == 'investor': 
     profile = InvestorProfile.objects.get(user=request.user) 
    elif profile_type == 'manager': 
     profile = ManagerProfile.objects.get(user=request.user) 
    context = base_context(request) 
    if request.method == 'POST': 
     notify = "You have successfully updated your profile." 
     user_info_form = UserInfoForm(request.POST, request.FILES) 
     if user_info_form.is_valid(): 
      user_info_form.save(request.user, profile_type) 
      return HttpResponseRedirect(request.POST.get('next', '/profile/' + profile_type + '/' + request.user.username + '/')) 
    else: 
     initial = {} 
     initial['first_name'] = request.user.first_name 
     initial['last_name'] = request.user.last_name 
     initial['email'] = request.user.email 
     initial['about'] = profile.about 
     initial['country'] = profile.country 
     initial['about'] = profile.about 
     # // Tried this ... 
     if profile_type == 'investor': 
      initial['investor_type'] = profile.investor_type 
     elif profile_type == 'manager': 
      profile.investor_type.required = False 
     # // Failed 
     user_info_form = UserInfoForm(initial=initial) 
    context['user_info_form'] = user_info_form 
    context['profile_type'] = profile_type 
    context['profile'] = profile 
    return render_to_response('edit/profile.html', context, context_instance=RequestContext(request)) 

我很感谢您的帮助,并提前致谢。

+0

当您对投资者类型设置required = False时会发生什么? – joshcartme 2012-04-04 17:20:49

+0

哪一行产生这种异常?也请看下面的答案,看看是否有帮助。我认为在全球范围内设置为required = False,使用clean方法可能是更好的方法。 – joshcartme 2012-04-04 17:29:52

回答

2

我会成立投资者类型:

required=False 

然后创建,检查什么类型的用户的形式的清洁方法。如果它的投资者和他们没有指定投资者类型会抛出错误。如果这是一个经理让它通过。

您还需要确保您的个人资料模型允许investor_type为空和空: https://docs.djangoproject.com/en/dev/topics/db/models/#field-options

退房形式的清洁方法,此文档。 https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

+0

得到一个AttributeError。但我发现它。这工作谢谢你。 – Modelesq 2012-04-04 17:27:41