簡體   English   中英

Django表單'int'對象對於在函數中添加的字段沒有屬性'required'

[英]Django Form 'int' object has no attribute 'required' for field that is added in function

在Django 1.6和脆皮表格中,我嘗試添加用戶提交后從API調用返回的forum_id_number 但是,我得到一個

Exception Value:    
'int' object has no attribute 'required'

在我提交表格之后。 我已經驗證了self.fields['forum_id_number'] = response["User"]["Id"]導致了這種情況。


class AccountForm(forms.ModelForm):
    class Meta:
        model = Employee

    def __init__(self, *args, **kwargs):
        super(AccountForm, self).__init__(*args, **kwargs)
        self.helper = FormHelper()
        self.helper.form_class = 'form-horizontal'
        self.helper.label_class = 'col-lg-2 control-label'
        self.helper.field_class = 'col-lg-4'

        self.helper.layout = Layout(
            Fieldset('Account Modify',
                'irc_name',
                'forum_username',
                Hidden('user_assigned', '{{ user.pk }}'),
                Hidden('forum_id_number', '0'),
                ),

            FormActions(
                Submit('submit', 'Submit', css_class='btn-primary')
                )
         )

    def clean_forum_username(self):
        data = self.cleaned_data['forum_username']
        SLUG = "users/" + data + ".json"
        status_code, response = do_request(SLUG)
        if status_code != 200:
            raise forms.ValidationError("Your username was not"
                                        " found! Please check the"
                                        " the spelling. Also, your"
                                        " forum username is your"
                                        " forum sign in name.")
        elif status_code == 200:
            self.fields['forum_id_number'] = response["User"]["Id"]
        return data

class Employee(models.Model):
    user_assigned = models.ForeignKey(settings.AUTH_USER_MODEL,
            related_name='r_assigned')
    irc_name = models.CharField(max_length="25",
            unique=True)
    forum_id_number = models.BigIntegerField(unique=True)
    forum_username = models.CharField(max_length="50",
            unique=True)

    def __unicode__(self):
        return self.irc_name

self.fields['forum_id_number']forms.Field子類的實例。 它描述了屬性self.forum_id_number 該行self.fields['forum_id_number'] = response["User"]["Id"]覆蓋此字段描述,並將其設置為(Big?)Integer對象的實例。 當然,這種情況下有沒有屬性required

forum_id_number設置值的“正確”方法是使用self.forum_id_number = response["User"]["Id"]self.cleaned_data['forum_id_number'] = response["User"]["Id"]

正確用引號引起來,因為在這種情況下,這實際上不是正確的方法。 有沒有知道如果該字段的方式forum_id_number在任何清洗clean_FIELD方法,所以你不知道你是否應該設置self.forum_id_numberself.cleaned_data['forum_id_number'] 現在,在forum_id_number的情況下,不存在安全問題,但是具有Firebug或類似功能的任何人都可以更改user_assigned的值。 通常最好從表單中排除隱藏字段,並在表單的save方法中設置實例本身的值。 當然,您不能在save方法中引發ValidationError (雖然可以,但是會產生500 Internal Server Error ),所以您必須在clean_forum_username方法中獲取用戶ID:

class AccountForm(forms.ModelForm):
    ....
    def clean_forum_username(self):
        data = self.cleaned_data['forum_username']
        SLUG = "users/" + data + ".json"
        status_code, response = do_request(SLUG)
        if status_code != 200:
            raise forms.ValidationError("Your username was not"
                                        " found! Please check the"
                                        " the spelling. Also, your"
                                        " forum username is your"
                                        " forum sign in name.")
        elif status_code == 200:
            self.response = response
        return data

    def save(self, *args, **kwargs):
        # self.response should be valid, otherwise a `ValidationError` would've been raised
        self.instance.forum_id_number = self.response['User']['Id']
        return super(AccountForm, self).save(*args, **kwargs)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM