将登录用户传递给模型字段django

时间:2014-10-10 17:56:05

标签: django django-forms django-views django-crispy-forms

我不知道如何从当前用户那里获取用户名。

我有一个使用djano-crispy-forms呈现的编辑表单:

class RecepcionForm(forms.ModelForm):
    fecha_recepcion = forms.DateField(widget=DateInput())
    def __init__(self,*args,**kwargs):
       super(RecepcionForm,self).__init__(*args,**kwargs)
       self.helper = FormHelper(self)
       self.helper.layout = Layout(
            Field('id_proveedor',
                  'anio',
                  'mes',
                  'usuario',
                  readonly = True
             ),
            Fieldset('',
                     'fecha_recepcion',
                     'num_archivos',
                     Submit('save','Grabar')
            )
       )
    class Meta:
       model = DetalleRecepcion

我的views.py

@login_required(login_url='/login/')
def RecepcionView(request):
    idp = request.GET.get('i')
    anio = request.GET.get('a')
    mes = request.GET.get('m')
    if request.method == 'POST':
       r = DetalleRecepcion.objects.get(id_proveedor=idp,anio=anio,mes=mes)
       form = RecepcionForm(request.POST, instance=r)
       if form.is_valid():
          form.save()
          return HttpResponseRedirect('/monitor/')
    else:
       r = DetalleRecepcion.objects.get(id_proveedor=idp,anio=anio,mes=mes)
       form = RecepcionForm(instance=r)

    return render_to_response('recepcion.html',
                              {'form':form},
                              context_instance=RequestContext(request))

我需要使用记录的用户名填写字段usuario。 在保存表单之前,我尝试使用form = request.user.username。 我很困惑,必须在表单定义或视图中传递值。

如果可以覆盖数据库中检索到的值,并使用表单类中的用户名填充该字段。

另一个问题 如何更改表单中的窗口小部件类型。字段id_proveedor是一个外键,并呈现为下拉框(选择小部件),但我需要显示标签中显示的值,无法编辑该值。 我尝试使用readonly属性,但用户无法在选择框中写入,但能够从下拉列表中进行选择。 如何更改窗口小部件或如何从选择框中禁用drop dwon功能

提前致谢

2 个答案:

答案 0 :(得分:0)

您始终可以将所需的任何参数或关键字参数传递给表单类,只需将其从调用*args时传递的**kwargssuper()中删除,否则Django会抛出一个例外,因为它收到的argkwarg没有预料到:

class MyForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        self.user = kwargs.pop('user')  # notice the .pop()
        super(MyForm, self).__init__(*args, **kwargs)


# views.py

def my_view(request):
    # assuming the user is logged in
    form = MyForm(user=request.user)

答案 1 :(得分:0)

我遇到了与您的问题相同的问题,并且刚刚找到了解决方案。我不知道这是否是最佳解决方案,或者我以后会遇到问题。

def add_trip_event(request):
#form = Trip_EventForm()
#return render(request, 'trips/add_trip_event.html', {'form': form})

if request.method == "POST":
    form = Trip_EventForm(request.POST, request.FILES)
    if form.is_valid():
        post = form.save(commit=False)
        post.trip_owner = Owner.objects.get(owner=request.user)
        post.pub_date = timezone.now()
        post.view = 0
        post.save()
        form.save_m2m()

        return HttpResponseRedirect(reverse('trips:index'))
else:
    form = Trip_EventForm()
return render(request, 'trips/add_trip_event.html', {'form': form})