以 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))