如何使用ModelForm过滤Django表单中的值?

时间:2017-02-03 06:34:38

标签: django django-forms django-views

问题是我有一个与用户关联的模型secciones和一个也与用户和模型secciones相关联的productos模型,

class secciones(models.Model):
   name = models.CharField(max_length=50)
   user = models.ForeignKey(User)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.name)
        super(secciones, self).save(*args, **kwargs)

    def __unicode__(self):
        return self.name

class productos(models.Model):
    user        = models.ForeignKey(User)
    secciones   = models.ForeignKey(secciones)
    name        = models.CharField(max_length=50)
    image       = models.ImageField(upload_to = 'productos')
    precio      = models.DecimalField(max_digits=10, decimal_places=2, default=0.00)
    descripcion = models.TextField(max_length=300, null=True,blank=True)

    def save(self, *args, **kwargs):
        if not self.id:
            self.slug = slugify(self.name)
        super(productos, self).save(*args, **kwargs)

    def __unicode__(self):
       return self.name

我正在创建一个表单,以便用户可以在productos模型中输入新产品,但我只想留下我登录的用户的模型部分

这是视图

def agregar_producto(request):
    if request.method == "POST":
        modelform = AgregarProducto(request.POST,request.FILES)
        print modelform
        if modelform.is_valid():
            modelform.save()

        return redirect("/editar-perfil/")
    else:
        modelform = AgregarProducto()
    return render(request, "home/AgregarProducto.html", {"form":modelform})

这是表格

class AgregarProducto(forms.ModelForm):
    class Meta:
        model   = productos

如何让表单只显示登录用户的模型secciones部分

1 个答案:

答案 0 :(得分:1)

覆盖模型的__init__方法,并设置secciones字段的查询集。

class AgregarProducto(forms.ModelForm):
    class Meta:
        model   = productos

    def __init__(self, *args, **kwargs):
        user = kwargs.pop('user')
        super(AgregarProducto, self).__init__(*args, **kwargs)
        self.fields['secciones'].queryset = secciones.objects.filter(user=user)

现在更新您的视图,以便在实例化表单时传递user。您需要为GET和POST请求执行此操作。

if request.method == "POST":
    modelform = AgregarProducto(request.POST, request.FILES, user=request.user)
    ...
else:
    modelform = AgregarProducto(user=request.user)

您可以使用login_required装饰器,以便只有登录的用户才能访问该视图。

from django.contrib.auth.decorators import login_required

@login_required
def agregar_producto(request):

最后,请将模型重命名为SeccionesProductos。对于大多数Django用户来说,小写seccionesproductos看起来很不寻常,并且可能与模型实例混淆。