从django表单中的ModelChoice字段保存记录时出错

时间:2015-02-24 15:54:36

标签: django django-forms django-views django-widget

我有一个带有modelchoice字段的FormModel。模型选择小部件基于已记录的用户

进行过滤
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小部件中的所有记录。

我不知道错误在哪里,或者我错过了什么。

任何建议

提前致谢

1 个答案:

答案 0 :(得分:0)

您已将__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))