如何使用ModelForm过滤Django 1.7表单中的值?
我正在尝试使用ModelForm添加数据。它工作得很好,除了ForeignKey下拉列表显示所有值,我只希望它显示与登录用户相关的值 这些是我的模型:如何使用ModelForm过滤Django 1.7表单中的值?,django,django-models,django-forms,django-templates,django-views,Django,Django Models,Django Forms,Django Templates,Django Views,我正在尝试使用ModelForm添加数据。它工作得很好,除了ForeignKey下拉列表显示所有值,我只希望它显示与登录用户相关的值 这些是我的模型: class productos(models.Model): user = models.ForeignKey(User) secciones = models.ForeignKey(secciones) name = models.CharField(max_length=50) image = mo
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
#####################################################################
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 AgregarProducto(forms.ModelForm):
class Meta:
model = productos
最后,查看代码:
def agregar_producto(request):
if request.method == "POST":
modelform = AgregarProducto(request.POST,request.FILES,user=request.user)
print modelform
if modelform.is_valid():
modelform.save()
return redirect("/editar-perfil/")
else:
modelform = AgregarProducto()
return render(request, "home/AgregarProducto.html", {"form":modelform})
如何使表单仅显示secciones.user等于登录用户的secciones子集?
AgregarProducto
与NewProduct
相同,对吗?我希望你用英语告诉我们
您需要来自secciones
的特定对象,下面的脚本就是一个例子
1yourapp/models.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
2yourapp/forms.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
3yourapp/views.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
3<代码>URL.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
从django.conf.url导入url
从yourapp.views导入(agregar\u产品,编辑产品)
URL模式=[
网址(
r“^product/new/$”,
agregar_producto,name='new_product_page'
),
网址(
r“^product/(?P[-\d]+)/edit/$”,
编辑产品,名称=“编辑产品页面”
),
]
希望对您有所帮助。
AgregarProducto
与新产品一样
对吗?我希望你用英语告诉我们
您需要来自secciones
的特定对象,下面的脚本就是一个例子
1yourapp/models.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
2yourapp/forms.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
3yourapp/views.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
3<代码>URL.py
class Secciones(models.Model):
user = models.ForeignKey(User)
name = models.CharField(max_length=50)
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/%Y/%m/%d/')
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
class AgregarProducto(forms.ModelForm):
class Meta:
model = Productos
fields = '__all__'
exclude = ['user', 'secciones']
from django.shortcuts import (render, redirect, get_object_or_404)
from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from yourapp.models import (Secciones, Productos)
from yourapp.forms import AgregarProducto
@login_required
def agregar_producto(request):
"""
add new product view.
"""
template_name = 'home/AgregarProducto.html'
secciones = Secciones.objects.filter(user=request.user)
if secciones.exists() == False:
# do stuff, eg:
return redirect('/error/page')
if request.method == 'POST':
form = AgregarProducto(request.POST, request.FILES)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = request.user # here you save current user logged in.
# and also the `secciones` set single object,
# because I see in your model is `ForeignKey`
initial_object.secciones = secciones.first()
initial_object.save()
form.save()
# you also can redirect to the saved object
# an example;
return redirect(reverse('edit_product_page', kwargs={'pk': initial_object.pk}))
else:
context = {'form': form, 'errors': form.errors}
return render(request, template_name, context)
else:
form = AgregarProducto()
return render(request, template_name, {'form': form})
@login_required
def edit_product(request, pk):
"""
`productos` is from your model:productos
I suggest you to use `uppercase` in your class name;
eg: `Productors` but not `productos`
:param `pk` is pk/id from instance object of `productos`
"""
template_name = 'homee/edit_product.html'
product = get_object_or_404(Productos, pk=pk)
if request.method == 'POST':
# instance the form from object of `product` above.
form = AgregarProducto(request.POST, request.FILES, instance=product)
if form.is_valid():
initial_object = form.save(commit=False)
initial_object.user = product.user # set from user creation
initial_object.save()
form.save()
#do stuff
from django.conf.urls import url
from yourapp.views import (agregar_producto, edit_product)
urlpatterns = [
url(
r'^product/new/$',
agregar_producto, name='new_product_page'
),
url(
r'^product/(?P<pk>[-\d]+)/edit/$',
edit_product, name='edit_product_page'
),
]
从django.conf.url导入url
从yourapp.views导入(agregar\u产品,编辑产品)
URL模式=[
网址(
r“^product/new/$”,
agregar_producto,name='new_product_page'
),
网址(
r“^product/(?P[-\d]+)/edit/$”,
编辑产品,名称=“编辑产品页面”
),
]
希望对您有所帮助。似乎您想要的是提供一组经过筛选的节,以便在构建表单时可以使用初始参数:
def agregar_producto(request):
if request.method == "POST":
modelform = AgregarProducto(request.POST,request.FILES,user=request.user)
print modelform
if modelform.is_valid():
modelform.save()
return redirect("/editar-perfil/")
else:
modelform = AgregarProducto(initial={'user':request.user}) #pass in the authenticated user
return render(request, "home/AgregarProducto.html", {"form":modelform})
class AgregarProducto(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AgregarProducto, self).__init__(*args, **kwargs)
if kwargs.get('initial'):
user = kwargs.get('initial').get('user')
if user:
sections = secciones.objects.filter(user_id=user.id)
self.fields['secciones'].choices = [(s.id, s.name) for s in sections]
self.fields['client'].choices = [('', '---------')]+self.fields['client'].choices #this adds an "empty" option
class Meta:
model = productos
然后以你的形式:
def agregar_producto(request):
if request.method == "POST":
modelform = AgregarProducto(request.POST,request.FILES,user=request.user)
print modelform
if modelform.is_valid():
modelform.save()
return redirect("/editar-perfil/")
else:
modelform = AgregarProducto(initial={'user':request.user}) #pass in the authenticated user
return render(request, "home/AgregarProducto.html", {"form":modelform})
class AgregarProducto(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AgregarProducto, self).__init__(*args, **kwargs)
if kwargs.get('initial'):
user = kwargs.get('initial').get('user')
if user:
sections = secciones.objects.filter(user_id=user.id)
self.fields['secciones'].choices = [(s.id, s.name) for s in sections]
self.fields['client'].choices = [('', '---------')]+self.fields['client'].choices #this adds an "empty" option
class Meta:
model = productos
这将仅在下拉列表中显示用户的节,使用id作为值,使用名称作为显示。似乎您想要的是提供一组经过筛选的节,因此您可以在构建表单时使用初始参数:
def agregar_producto(request):
if request.method == "POST":
modelform = AgregarProducto(request.POST,request.FILES,user=request.user)
print modelform
if modelform.is_valid():
modelform.save()
return redirect("/editar-perfil/")
else:
modelform = AgregarProducto(initial={'user':request.user}) #pass in the authenticated user
return render(request, "home/AgregarProducto.html", {"form":modelform})
class AgregarProducto(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AgregarProducto, self).__init__(*args, **kwargs)
if kwargs.get('initial'):
user = kwargs.get('initial').get('user')
if user:
sections = secciones.objects.filter(user_id=user.id)
self.fields['secciones'].choices = [(s.id, s.name) for s in sections]
self.fields['client'].choices = [('', '---------')]+self.fields['client'].choices #this adds an "empty" option
class Meta:
model = productos
然后以你的形式:
def agregar_producto(request):
if request.method == "POST":
modelform = AgregarProducto(request.POST,request.FILES,user=request.user)
print modelform
if modelform.is_valid():
modelform.save()
return redirect("/editar-perfil/")
else:
modelform = AgregarProducto(initial={'user':request.user}) #pass in the authenticated user
return render(request, "home/AgregarProducto.html", {"form":modelform})
class AgregarProducto(forms.ModelForm):
def __init__(self, *args, **kwargs):
super(AgregarProducto, self).__init__(*args, **kwargs)
if kwargs.get('initial'):
user = kwargs.get('initial').get('user')
if user:
sections = secciones.objects.filter(user_id=user.id)
self.fields['secciones'].choices = [(s.id, s.name) for s in sections]
self.fields['client'].choices = [('', '---------')]+self.fields['client'].choices #this adds an "empty" option
class Meta:
model = productos
这将只在下拉列表中显示用户的部分,使用id作为值,使用名称作为显示。谢谢朋友,但我需要的是在模板中只保留用户登录的部分,而不是所有用户的部分,如果您能帮助我,我将不胜感激。您可以使用wrapper或自定义wrapper来要求用户必须登录。您可以在这一行中看到:
Secciones.objects.filter(user=request.user)
,它只过滤当前访问者/用户的Secciones
。查看我的更新…谢谢朋友,但我需要的是,在模板中只保留用户登录的部分,而不是所有用户的部分,如果您能帮助我,我将非常感激。您可以使用包装器或自定义包装器来要求用户必须登录。您可以在这一行中看到:Secciones.objects.filter(user=request.user)
,它只过滤当前访问者/用户的密码。请参阅我的更新。。。