2012-04-04 9 views
0

2 Arten von Benutzern bestehen Investoren und Manager. Einige Benutzer (Investoren) sollten in der Lage sein, investor_type und andere (Manager) auszufiltern, sollte nicht ... Ich habe ein Formular. BenutzerinfoForm. Und ich frage mich nur, ob es einen einfachen Weg gibt, diese Manager-Benutzer auszuschließen, dieses Feld auszufüllen.Wie kann ein Feld in einem [vanilla django] Formular ausgeschlossen werden?

In meiner Vorlage habe ich es erfolgreich geschafft, Manager von der Anzeige des Feldes investor_type auszuschließen. Nach dem Senden des UserInfoForms wird jedoch Folgendes angezeigt: investor_type This field is required. innerhalb der Vorlage.

Gibt es einen Weg, den ich setzen kann, erforderlich = Nur für Anleger wahr?

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) 

Ich habe investor_type = forms.CharField(max_length=4, required=False, widget=forms.Select(choices=choices), initial='0') versucht, hat nicht funktioniert.

Views.py: versucht innerhalb der Ansicht = fehlgeschlagen.

@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)) 

Ich schätze die Hilfe und danke Ihnen im Voraus.

+0

Was ist passiert, wenn Sie auf dem Anlegertyp required = False gesetzt haben? – joshcartme

+0

Welche Zeile hat diese Ausnahme erzeugt? Sehen Sie sich auch meine Antwort unten an und schauen Sie, ob das hilft. Ich denke, es global auf erforderlich setzen = False und die Verwendung der sauberen Methode kann ein besserer Ansatz sein. – joshcartme

Antwort

2

würde ich Anlegertyp einstellen:

required=False 

Dann eine saubere Methode für das Formular erstellen, der überprüft, welche Art von Benutzer. Wenn es ein Investor ist und sie keinen investor_type angegeben haben, wird ein Fehler ausgegeben. Wenn es ein Manager ist, lassen Sie es durch.

Sie müssen auch sicherstellen, dass Ihr Profilmodell ermöglicht investor_type leer und null zu sein: https://docs.djangoproject.com/en/dev/topics/db/models/#field-options

Schauen Sie sich diese Dokumentation auf eine saubere Methode des Formulars. https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

+0

Wurde ein AttributeError erhalten. Aber ich habe es gefunden. Das hat funktioniert, danke. – Modelesq

Verwandte Themen