Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用ModelForm过滤Django 1.7表单中的值?_Django_Django Models_Django Forms_Django Templates_Django Views - Fatal编程技术网

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

如何使用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

我正在尝试使用ModelForm添加数据。它工作得很好,除了ForeignKey下拉列表显示所有值,我只希望它显示与登录用户相关的值

这些是我的模型:

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
的特定对象,下面的脚本就是一个例子

1
yourapp/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'
    ),
]
2
yourapp/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'
    ),
]
3
yourapp/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
的特定对象,下面的脚本就是一个例子

1
yourapp/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'
    ),
]
2
yourapp/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'
    ),
]
3
yourapp/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)
,它只过滤当前访问者/用户的
密码。请参阅我的更新。。。