python - Django - 找出我在内联表单集中编辑的模型实例

标签 python django inline-formset

注意:我是 Django 和 Python 的新手。我不确定我是否在某种程度上误解了内联表单集的使用。

我需要能够在一种表单中同时编辑 Guest 模型的多个实例(链接到父 Invite 模型)的某些字段。经过多次来回,我成功设置了一个可以成功提交的内联表单集。

但是,界面很困惑,因为您不知道要为哪位访客填写详细信息。每个 guest 都有一个 guest_name 字段,我只想为每个表单显示该名称,以便用户知道他们正在为谁进行编辑。

这是我的(浓缩)观点:

def extra_view(request, code):
    # Get the specific invite
    invite = get_invite(code)

    # Get the context from the request.
    context = RequestContext(request)

    # Store guests attending object
    guests_attending = invite.guest_set.filter(attending=True, invite=invite)

    # Create the formset for each Guest
    GuestFormset = inlineformset_factory(Invite, Guest,
                                         form=ExtraForm,
                                         fields=('diet', 'transport'),
                                         extra=0,
                                         can_delete=False)

    if request.method == "POST":
        formset = GuestFormset(request.POST, request.FILES,
                               instance=invite,
                               queryset=Guest.objects.filter(attending=1))

        if formset.is_valid():
            # Save the data to the database.
            formset.save()

            # Redirect stuff here

    if guests_attending.count() > 0:
        formset = GuestFormset(instance=invite, queryset=Guest.objects.filter(attending=1))

        # Return the view
        return render_to_response('app/extra.html', {
            'GuestForm': formset,
            'invite': invite,
            'guests_attending': guests_attending,
            'errors': formset.errors
        }, context)
    else:
        # Backup for if no guests are attending

模型的外观如下:

class Invite(models.Model):
    # Code to identify invites by
    code = models.CharField(max_length=6, default=code_generator(4, do_check=True), unique=True)
    group_name = models.CharField(max_length=200)

    def __str__(self):
        return self.group_name


class Guest(models.Model):
    invite = models.ForeignKey(Invite, on_delete=models.CASCADE)
    guest_name = models.CharField(max_length=200)
    diet = models.CharField(max_length=250, null=True, blank=True)
    transport = models.NullBooleanField(default=False)
    attending = models.NullBooleanField(default=False)

    def __str__(self):
        return self.guest_name

这是我的模板

    {% if invite %}    
        <form method="post" action="">
            {% csrf_token %}
            {{ GuestForm.management_form }}
            <table>
                {% for form in GuestForm %}

                    <!-- Which guest am I editing for?! -->

                    {% for hidden in form.hidden_fields %}
                        {{ hidden }}
                    {% endfor %}

                    {% for field in form.visible_fields %}
                        {{ field.errors }}

                        <div>
                            {{ field.help_text }}
                            {{ field }}
                        </div>
                    {% endfor %}
                {% endfor %}
            </table>

            <button type="submit" class="btn">Continue</button>
        </form>
    {% endif %}

最佳答案

您可以使用form.instance访问表单的实例。在模板中,您可以执行以下操作:

{{ form.instance.guest_name }}

关于python - Django - 找出我在内联表单集中编辑的模型实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37115155/

相关文章:

python - 如何在基于类的 View (模板 View )中进行多个模型查询

css - drupal6错误ajax内联

django - 模型表单集 - 默认情况下,模型表单集呈现一个额外的字段(总共 2 个字段)

python - scipy最小二乘法中的正交回归拟合

python - Redshift COPY 语句日期加载错误

python - 从托管网站调用服务器上的本地 api

python - 如何将自定义字段添加到 InlineFormsets?

python - 在 Django 中将变量从模板传递到 View 的更有效方法是什么?

Django 在 ManyToMany 计数上过滤模型,并使用特定于每个对象的限制?

python - Django 中的属性缓存 - 有什么意义?