问题是我有一个与用户关联的模型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部分
答案 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):
最后,请将模型重命名为Secciones
和Productos
。对于大多数Django用户来说,小写secciones
和productos
看起来很不寻常,并且可能与模型实例混淆。