0

ユーザーには、投資家と経営者の 2 種類があります。一部のユーザー (投資家) は、investor_type に入力できるはずですが、他のユーザー (マネージャー) は入力できないはずです... 1 つのフォームがあります。ユーザー情報フォーム。そして、それらの管理者ユーザーがそのフィールドに入力できないようにする簡単な方法があるかどうか疑問に思っています.

私のテンプレートでは、マネージャーがInvestor_type フィールドを表示しないようにすることに成功しました。しかし、UserInfoForm を送信するとinvestor_type This field is required.、テンプレート内に表示されます。

required=True を投資家のみに設定できる方法はありますか?

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

助けに感謝し、前もって感謝します。

4

1 に答える 1

2

投資家タイプを次のように設定します。

required=False

次に、ユーザーのタイプをチェックするフォームのクリーン メソッドを作成します。投資家で、investor_type を指定しなかった場合、エラーがスローされます。管理人なら任せてください。

また、プロファイル モデルで、investor_type を空白および null にすることが許可されていることを確認する必要があります: https://docs.djangoproject.com/en/dev/topics/db/models/#field-options

フォームの clean メソッドについては、このドキュメントを参照してください。 https://docs.djangoproject.com/en/dev/ref/forms/validation/#cleaning-and-validating-fields-that-depend-on-each-other

于 2012-04-04T17:22:16.333 に答える