【问题标题】:Complicated Django ModelForm validation with OneToOneField and customed argument使用 OneToOneField 和自定义参数进行复杂的 Django ModelForm 验证
【发布时间】:2016-07-01 14:33:15
【问题描述】:

很抱歉这个冗长的问题。我对 django modelform 验证有一个复杂的情况。我已经准备好一个模型 UserProject 并创建了许多对象。我还有另一个模型 Action_Inputs 来接受多个参数,这是与 UserProject 的 onetoonefield 关系。我确实需要 Action_Inputs 的一个字段的自定义输入参数。但我无法验证表格。

models.py

class UserProject(models.Model):
    pid = models.CharField(max_length=10, null=False, unique=True)
    email = models.EmailField(max_length=254, null=False)
    directory = models.CharField(max_length=255)

class Action_Inputs(models.Model):
    userproject = models.OneToOneField(UserProject, null=False)
    method = models.CharField(max_length=255)
    file = models.FileField(upload_to='userdata')

现在我有以下 ModelForm,它接受一个自定义输入参数 jobid,从 url 捕获,这是一个返回到以前的 UserProject pid 的字符串:

class ActionInputsForm(ModelForm):

    def __init__(self, jobid, *args, **kwargs):
        super(ActionInputsForm, self).__init__(*args, **kwargs)
        self.fields['userproject'].initial = jobid

    class Meta:
        model = Action_Inputs
        fields = ['userproject', 'method', 'file'] # userproject will be hidden

    def clean_userproject(self):
        userproject = self.cleaned_data['userproject']
        if len(userproject) != 10:
            raise forms.ValidationError("---PID error.")
        return UserProject.objects.get(pid=userproject)

    def clean(self):

        return self.cleaned_data

在我看来.py

def parameters_Inputs(request, jobid):

    if request.method == "POST":
        form1 = ActionInputsForm(request.POST, request.FILES, jobid)

        if form1.is_bound:
            form1.save()
            return render(request, 'goodlog.html', {'jobid': jobid})

    elif request.method == "GET":
        form1 = ActionInputsForm(jobid)

    return render(request, 'inputsform.html',
        {'form1': form1, 'jobid': jobid})

现在request.POST['userproject']是空的,说明jobid没有被init修改过,request.FILES看起来正确但是验证是假的。它说Unicode对象没有attrite get,这与上传的文件有关。关于什么是错的任何想法?非常感谢。

以下作品:(感谢 Vladimir Danilov)

def __init__(self, jobid, *args, **kwargs):
    super(ActionInputsForm, self).__init__(*args, **kwargs)
    self.fields['userproject'].initial = UserProject.objects.get(pid=jobid)


def clean_userproject(self):
    userproject = self.cleaned_data['userproject']
    if not userproject:
        raise forms.ValidationError("---UserProject not found.")
    return userproject

def parameters_Inputs(request, jobid):

if request.method == "POST":
    form1 = ActionInputsForm(jobid, request.POST, request.FILES)

.......

【问题讨论】:

    标签: django validation modelform


    【解决方案1】:

    不回答,但您是指这些行中的ActionInputsForm 而不是Action_Inputs

    form1 = Action_Inputs(request.POST, request.FILES, jobid)
    # ...
    form1 = Action_inputs(jobid)
    

    另外,你应该写ActionInputsForm(jobid, request.POST, request.FILES)。 因为在您的情况下,jobid 将是 request.POST

    【讨论】:

    • 抱歉输入错误。是的,论点的立场很重要。非常感谢。
    猜你喜欢
    • 2012-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-06
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多