标签: inline-formset

DJANGO:如何限制inlineformset查询集

欧盟可以使用此表单来选择他们为任何给定项目播放的角色(项目经理,开发人员等).我想将项目字段选项限制为仅限于员工部门的选项.现在,欧盟可以选择任何部门的项目(但不是部门,我完全排除了)我该怎么做?queryset = blabla不起作用..

楷模:

class Department(models.Model):
    name = models.CharField(max_length=20)
    def __unicode__(self):
        return self.name

class Employee(models.Model):
    fname = models.CharField(max_length=15)
    department = models.ForeignKey(Department)
    def __unicode__(self):
        return self.fname

class Projecttype(models.Model):
    name = models.CharField(max_length=20)
    def __unicode__(self):
        return self.name

class Project(models.Model):
    projecttype = models.ForeignKey(Projecttype)
    department = models.ForeignKey(Department)
    members = models.ManyToManyField(Employee, through='Membership')
    def __unicode__(self):
       return "%s > %s" % (self.department, self.projecttype)

class Role(models.Model):
    name = models.CharField(max_length=20)
    def __unicode__(self):
       return self.name

class Membership(models.Model):
    project = models.ForeignKey(Project, null=True)
    department = models.ForeignKey(Department)
    employee = models.ForeignKey(Employee)
    role = models.ManyToManyField(Role, blank=True, …
Run Code Online (Sandbox Code Playgroud)

django model view django-queryset inline-formset

5
推荐指数
1
解决办法
4057
查看次数

在django-extra-views中预先填充和保存内联

我正在使用django-extra-views,我想用预先填充的数据填充表单及其相关的内联,然后保存(创建对象).到目前为止,我有:

from extra_views import CreateWithInlinesView

class ItemCreateView(extra_views.CreateWithInlinesView):

    def dispatch(self, request, item_pk, *args, **kwargs):
        self.item = models.Item.objects.get(id=item_pk)
        return super(ItemCreateView, self).dispatch(
            request, *args, **kwargs
        )

    def get_initial(self):
        # Thanks to that method a form is populated with initial data.
        return forms.ItemCreateForm(instance=self.item).initial

    def construct_inlines(self):
        # Thanks to that method a form and its inlines are prepopulated successfully.
        ItemFormSet = inlineformset_factory(models.Item, models.ItemEntry, extra=0)
        formset = ItemFormSet(instance=self.item)
        return [formset]
Run Code Online (Sandbox Code Playgroud)

但是,尽管内联值是通过POST发送的,但是保存对象时没有内联.我究竟做错了什么?我应该初始化表单并以不同的方式内联吗?

django django-forms formset inline-formset

5
推荐指数
0
解决办法
499
查看次数

在 InlineModelAdmin 表单中访问内联对象

我有这样的问题:我想限制内联模型管理中的外键选择,但我想根据此内联对象中指定的一些值来执行此操作。

如何在 InlineModelAdmin 方法(特别是在formfield_for_foreignkey(self, db_field, request, **kwargs))中访问内联对象(不是父对象)?

django django-admin inline-formset

5
推荐指数
2
解决办法
3408
查看次数

如何在 Django 中创建具有多关系的内联表单集

我想在预购模型和产品模型之间创建内联表单集。场景是,当用户决定创建预购时,他将能够选择一种或多种产品。另一方面,一种产品可能会出现在一个或多个预购订单中。考虑到这一点,我创建了多对多关系。

模型.py

class Preorder(models.Model):

    client = models.ForeignKey(Client,verbose_name=u'Client')
    invoice_date = models.DateField("Invoice date",null=True, blank=True, default=datetime.date.today)
    preorder_has_products = models.ManyToManyField(Product, blank=True)

    def get_absolute_url(self):
        return reverse('preorder_edit', kwargs={'pk': self.pk})


class Product(models.Model):

    name = models.CharField("Name",max_length=200)
    price = models.DecimalField("Price", max_digits=7, decimal_places=2, default=0)
    barcode = models.CharField(max_length=16, blank=True, default="")
    eopyy = models.CharField("Code eoppy",max_length=10, blank=True, default="")
    fpa = models.ForeignKey(FPA, null=True, blank=True, verbose_name=u'Fpa Scale')
Run Code Online (Sandbox Code Playgroud)

表格.py

class PreorderForm(ModelForm):

    class Meta:
        model = Preorder
        exclude = ('client','preorder_has_products',)

    def __init__(self, *args, **kwargs):
        super(PreorderForm, self).__init__(*args,**kwargs)
        self.fields['invoice_date'].widget = MyDateInput(attrs={'class':'date'})

class ProductForm(ModelForm):
    #name = ModelChoiceField(required=True,queryset=Product.objects.all(),widget=autocomplete.ModelSelect2(url='name-autocomplete')) …
Run Code Online (Sandbox Code Playgroud)

django inline inline-formset

5
推荐指数
0
解决办法
847
查看次数

如何在模板中检测表单集是否有任何错误?

由于django中出色的内联模型表单集,我有一个非常先进的表单,有4个内联表单集.在模板中,我在选项卡中显示每个formset.如果该选项卡中的formset完全有任何验证错误,那么一切都非常灵活,但是我想将选项卡颜色设置为红色.所以我尝试了这个:

<div id="tabs">
    <ul>
        <li><a href="#foo-tab"{% if forms.FooFormSet.errors %} class="error"{% endif %}>Foo</a></li>
        <li><a href="#bar-tab"{% if forms.BarFormSet.errors %} class="error"{% endif %}>Bar</a></li>
        <li><a href="#zoo-tab"{% if forms.ZooFormSet.errors %} class="error"{% endif %}>Zoo</a></li>
        <li><a href="#doo-tab"{% if forms.DooFormSet.errors %} class="error"{% endif %}>Doo</a></li>
    </ul>

    <div id="foo-tab"></div>
    <div id="bar-tab"></div>
    <div id="zoo-tab"></div>
    <div id="doo-tab"></div>
</div>
Run Code Online (Sandbox Code Playgroud)

但它不起作用,因为表单.*Set.errors是一个带有空字典的列表(所以它总是会返回True),如[{},{},{}](表单集中的表单数量是相同的空formset.errors中的字典

我认为一个解决方案可能是继承BaseInlineFormSet并添加一个has_errors方法或其他东西,然后对我的所有formset使用该子类化基础.还有其他建议吗?谢谢!

django django-templates django-forms inline-formset

4
推荐指数
1
解决办法
2353
查看次数

Django:缺少ManagementForm数据...... Formset不会验证.为什么?

出于某种原因,我提交后,我的formset将无法验证.关于这种方式的任何想法都可能发生?

#models.py

class Department(models.Model):
  department = models.CharField(verbose_name = "Department Name", max_length=100)
  description = models.TextField(verbose_name = "Description", blank=True, null=True)
  sp_description = models.TextField(verbose_name = "Description (Spanish)", blank=True, null=True)
  phone = PhoneNumberField()
  phone_ext = models.CharField(max_length=10, blank=True)

  #Relations
  provider = models.ForeignKey(Provider, blank=True, null=True)
  services_offered = models.ManyToManyField(ServiceType)

  def __unicode__(self):
    return self.department
Run Code Online (Sandbox Code Playgroud)

#view.py

def display_step5(request):
    msg = ''
    email = request.session.get('email')
    provider_obj = retrieve_provider_instance(email)
    AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
    if is_authenticated(request):
        AddDepartmentFormSet = inlineformset_factory(Provider, Department, extra=0)
        if request.method=='POST':
            if 'add_department' in request.POST:
                cp = request.POST.copy()
                cp['department-TOTAL_FORMS'] …
Run Code Online (Sandbox Code Playgroud)

python django validation formset inline-formset

4
推荐指数
1
解决办法
6005
查看次数

动态填充表单集中的字段

我有两个看起来像这样的模型:

class RouteBase(models.Model):
    base        =   models.ForeignKey("Base")
    route       =   models.ForeignKey("Route")
    sequence    =   models.IntegerField()

class Route(models.Model):
    bases       =   models.ManyToManyField("Base", through="RouteBase", blank=True)
    description =   models.TextField(blank=True)
    #and a few other attributes omitted for brevity
Run Code Online (Sandbox Code Playgroud)

...然后是一个看起来像这样的模型:

class RouteBaseForm(ModelForm):
    base = forms.ModelChoiceField(queryset=Base.objects.all(), widget=forms.TextInput)
    sequence = forms.IntegerField(widget=forms.HiddenInput)

    class Meta:
        model = RouteBase
Run Code Online (Sandbox Code Playgroud)

如您所见,序列窗口小部件是隐藏的,因为我希望这个字段由django自动处理.我希望用户只需通过文本框输入Base.序列由文本框的顺序推断.

我创建了一个带有此表单的formset,用于创建/编辑路径中的所有基础:

RouteBaseFormset = inlineformset_factory(Route, RouteBase, form=RouteBaseForm, extra=5, )
Run Code Online (Sandbox Code Playgroud)

创建此formset时,序列字段为空.在保存formset之前我需要用值填充它(否则它将不会验证).我可以想到四种方法

  1. 在我将formset发送到模板之前,我运行以下代码:
    i=1
    for form in formset.forms:
        form.fields["sequence"].initial = i
        i += 1

除了一个问题,这很好.当formset被提交回视图以进行保存时,使用formset创建的所有 5个额外字段都将填入序列值.当用户只想向路线添加2或3个碱基时,这会导致问题.弹出验证错误,因为该表单的必填字段"base"为空.我可以在formset被POST之后运行一些代码,检查是否存在一个base,如果没有,删除序列,但如果我要这样做,我也可以......

  1. 当formset为POST时运行一些代码,检查是否已输入Base,如果是,则添加序列,如果没有,则将该字段留空.这样,当您尝试.save()使用formset时,空值确保该特定表单不会放入数据库中.唯一的问题是我不能对表单做任何事情,直到我运行.save(commit=False)我不能做,因为formset不验证.但我可以......

  2. 通过复制request.POST变量并手动设置序列来添加序列值,但这看起来非常糟糕. …

django django-forms inline-formset

3
推荐指数
1
解决办法
1198
查看次数

Django:从formset中获取表单id

我不确定标题是否能准确描述我想要的内容.我想要的是实现类似的东西:Django添加/删除表单而无需多次提交.

但我没有列出我有表格和表格的项目.此formset的形式包含我可用于创建类似{%url'item_edit'item.id%}的链接的信息.问题是它是隐藏字段的值.在这里(http://docs.djangoproject.com/en/dev/topics/forms/#looping-over-the-form-s-fields)您有一个选项列表,如何在模板中使用表单的字段,但它们都不是{{field.value}}.如果我尝试过,那么它就会默默地失败.

无论如何.到代码.我在模板中有的是:

    <form enctype="multipart/form-data" method="post" action="/list/edit/{{ list.id }}/">
        <table>
        {{ form.as_table }}
        {{ formset.management_form }}
        {% for form in formset.forms %}
            {% if forloop.first %}
                <tr>
                {% for field in form.visible_fields %}
                    <td>{{ field.label }}</td>
                {% endfor %}
                </tr>
            {% endif %}
            <tr>
                {% for field in form.visible_fields %}
                    {% if not forloop.last %}
                        <td>{{ field }}</td>
                    {% else %}
                        <td>{{ field }}
                    {% endif %}
                {% endfor %}
                {% for field in form.hidden_fields %} …
Run Code Online (Sandbox Code Playgroud)

forms django inline-formset

3
推荐指数
1
解决办法
9933
查看次数

Django 内联表单集的图像字段未更新

我有一个列表模型和一个照片模型:

class Listing(models.Model):
    title = models.CharField(max_length=255)
    <more fields>...

class Photo(models.Model):
    image = models.ImageField(upload_to=create_file_path)
    listing = models.ForeignKey(Listing, related_name='photos')
Run Code Online (Sandbox Code Playgroud)

我正在使用 CBV、UpdateView 来编辑列表。我正在使用这个表格:

class ListingDetailForm(forms.ModelForm):
    class Meta:
    model = Listing
    exclude = []
Run Code Online (Sandbox Code Playgroud)

以及 forms.py 中的内联表单集,可以删除/更改图像:

PhotoFormset = inlineformset_factory(Listing, Photo, fields='__all__', extra=1)
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

PhotoFormset = inlineformset_factory(Listing, Photo, fields='__all__', extra=1)
Run Code Online (Sandbox Code Playgroud)

以及相关的模板部分:

{% block body %}
<form action="" method="post">
    {% csrf_token %}
        {% for field in form %}
            {{ field.errors }}
            {{ field.label_tag }} {{ field }}<br><br>
        {% endfor %}
        {% for field in photo_form …
Run Code Online (Sandbox Code Playgroud)

forms django image inline-formset

3
推荐指数
1
解决办法
2486
查看次数

Django Inline for ManyToMany生成重复查询

我的django管理员遇到了一些重大的性能问题.根据我有多少内联,有很多重复的查询.

models.py

class Setting(models.Model):
    name = models.CharField(max_length=50, unique=True)

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return self.name


class DisplayedGroup(models.Model):
    name = models.CharField(max_length=30, unique=True)
    position = models.PositiveSmallIntegerField(default=100)

    class Meta:
        ordering = ('priority',)

    def __str__(self):
        return self.name


class Machine(models.Model):
    name = models.CharField(max_length=20, unique=True)
    settings = models.ManyToManyField(
        Setting, through='Arrangement', blank=True
    )

    class Meta:
        ordering = ('name',)

    def __str__(self):
        return self.name


class Arrangement(models.Model):
    machine = models.ForeignKey(Machine, on_delete=models.CASCADE)
    setting = models.ForeignKey(Setting, on_delete=models.CASCADE)
    displayed_group = models.ForeignKey(
        DisplayedGroup, on_delete=models.PROTECT,
        default=1)
    priority = models.PositiveSmallIntegerField(
        default=100,
        help_text='Smallest number will …
Run Code Online (Sandbox Code Playgroud)

django duplicates django-queryset inline-formset

3
推荐指数
2
解决办法
1614
查看次数