使用 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
.
抱歉这个冗长的问题。我的 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
.