2014-10-10 55 views
0

我不知道如何从当前用户获取用户名。通过登录用户到模型字段django

我有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是一个外键,并呈现为一个下拉框(选择小部件),但我需要显示在无法编辑该值的标签中显示的值。 我尝试使用只读属性,但用户无法在选择框中书写,但可以从下拉列表中进行选择。 怎样才能改变Widget或我怎么能禁用下降DWON功能从选择框提前

感谢

+0

您可以通过'request.user.username'获取用户名。 – 2014-10-10 18:32:06

+0

您需要针对窗口小部件类型发布不同的问题。 – Brandon 2014-10-10 19:35:21

回答

0

你总是可以通过你需要一个窗体类的任何参数或关键字参数,你只需要

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) 
+0

感谢您的回复。我用'instance.usuario = request.user'解决了这个问题。 – Joseleg 2014-10-10 22:23:19

+0

对不起,我想我误解了你的问题,但是我希望我的代码示例在未来能够帮助你。 – Brandon 2014-10-11 01:11:53

0

我来到ACR:从被调用时super()传递的*args**kwargs删除它们,否则Django会因为它的接收argkwarg它不希望抛出一个异常oss与你的问题一样,并且刚刚找到解决方案。我不知道这是否是最好的解决方案,或者稍后我可能会遇到问题。

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