使用 OneToOneField 和自定义参数进行复杂的 Django ModelForm 验证

Complicated Django ModelForm validation with OneToOneField and customed argument

抱歉这个冗长的问题。我的 Django 模型形式验证情况很复杂。我准备了一个 UserProject 模型并创建了许多对象。我还有一个模型 Action_Inputs 可以接受多个参数,它与 UserProject 是单域关系。我确实需要 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

在我的views.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 object has no 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(请求,jobid):

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

.......

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

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

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