以 Django 形式从 ModelChoice 字段保存记录时出错
Error saving records from ModelChoice Field in django form
我有一个带有模型选择字段的 FormModel。 modelchoice 小部件根据登录用户进行过滤
class ProcFTPForm(forms.ModelForm):
#id_archivo = forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.all(),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
class Media:
css = {'all':('/admin/css/widgets.css',),}
js = ('/admin/jsi18n/','admin/jquery.js')
def __init__(self,usuario, *args, **kwargs):
super(ProcFTPForm, self).__init__(*args, **kwargs)
self.fields['id_archivo'] = forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.filter(usuario=usuario),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
class Meta:
model = Lista_Archivos
我的观点
@login_required(login_url='/login/')
def archivoview(request):
usuario = request.user
form = ProcFTPForm(request.POST or usuario )
if request.method == 'POST':
form = ProcFTPForm(request.POST)
if form.is_valid():
form.save()
proc = Lista_Final()
lista = proc.archivos()
tabla = Proc_Carga()
sp = tabla.carga()
return HttpResponseRedirect('/home/')
return render_to_response('archivo.html',{'form':form},context_instance=RequestContext(request))
此时一切正常。 FilteredSelectMultiple 小部件仅显示基于登录用户的选择
但是现在我无法保存。当我单击保存按钮时,小部件被清空并且记录未保存。
如果我改变这个形式:
forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.filter(usuario=usuario),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
对此:
forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.all(),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
表单工作正常并保存了 FilteredSelectMultiple 小部件中的所有记录。
不知道是哪里出错了,是不是遗漏了什么。
任何建议
提前致谢
您已将 __init__
方法的签名更改为
def __init__(self, usuario, *args, **kwargs):
所以你必须始终提供 usuario 作为第一个参数。
尝试将您的视图更改为以下内容:
@login_required(login_url='/login/')
def archivoview(request):
usuario = request.user
if request.method == 'POST':
form = ProcFTPForm(usario, request.POST)
if form.is_valid():
...
return HttpResponseRedirect('/home/')
else:
form = ProcFTPForm(usuario)
return render_to_response('archivo.html',{'form':form},context_instance=RequestContext(request))
我有一个带有模型选择字段的 FormModel。 modelchoice 小部件根据登录用户进行过滤
class ProcFTPForm(forms.ModelForm):
#id_archivo = forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.all(),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
class Media:
css = {'all':('/admin/css/widgets.css',),}
js = ('/admin/jsi18n/','admin/jquery.js')
def __init__(self,usuario, *args, **kwargs):
super(ProcFTPForm, self).__init__(*args, **kwargs)
self.fields['id_archivo'] = forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.filter(usuario=usuario),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
class Meta:
model = Lista_Archivos
我的观点
@login_required(login_url='/login/')
def archivoview(request):
usuario = request.user
form = ProcFTPForm(request.POST or usuario )
if request.method == 'POST':
form = ProcFTPForm(request.POST)
if form.is_valid():
form.save()
proc = Lista_Final()
lista = proc.archivos()
tabla = Proc_Carga()
sp = tabla.carga()
return HttpResponseRedirect('/home/')
return render_to_response('archivo.html',{'form':form},context_instance=RequestContext(request))
此时一切正常。 FilteredSelectMultiple 小部件仅显示基于登录用户的选择 但是现在我无法保存。当我单击保存按钮时,小部件被清空并且记录未保存。
如果我改变这个形式:
forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.filter(usuario=usuario),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
对此:
forms.ModelMultipleChoiceField(queryset=Archivo_Descarga.objects.all(),required=True,widget=FilteredSelectMultiple("Archivo",is_stacked=False),label='')
表单工作正常并保存了 FilteredSelectMultiple 小部件中的所有记录。
不知道是哪里出错了,是不是遗漏了什么。
任何建议
提前致谢
您已将 __init__
方法的签名更改为
def __init__(self, usuario, *args, **kwargs):
所以你必须始终提供 usuario 作为第一个参数。
尝试将您的视图更改为以下内容:
@login_required(login_url='/login/')
def archivoview(request):
usuario = request.user
if request.method == 'POST':
form = ProcFTPForm(usario, request.POST)
if form.is_valid():
...
return HttpResponseRedirect('/home/')
else:
form = ProcFTPForm(usuario)
return render_to_response('archivo.html',{'form':form},context_instance=RequestContext(request))