在基于类的视图中使用url参数设置表单字段

时间:2019-04-22 22:24:58

标签: python django forms

我正在django应用程序中创建一个表单。我的应用程序有一个用户,一个用户可以有很多交易,而一个交易可以有很多销售。我正在尝试创建一个表单以将销售添加到数据库。我正在尝试在URL(transaction_id)中传递参数,并在基于Django类的视图CreateView中使用它来设置表单中的对应(外键)字段。是否可以这样做,如果可以,我该如何应用。

下面基于类的创建视图

class SaleCreateView(CreateView):
    model = Sale
    fields = ['amount_sold', 'total_price_sold', 'note']

    def form_valid(self, form):


下面的URL

path('sale/new/<int:pk>', SaleCreateView.as_view(), name='sale-create'),

下面的链接

{% url 'sale-create' transaction.id %}

下面的销售表格

<div>
    <form method="POST">
        {% csrf_token %}
        <fieldset class ="form-group">
            <legend class="border-bottom mb-4">Enter Sale</legend>
            {{ form|crispy }}
        </fieldset>
        <div class="form-group">
            <button class ="btn btn-outline-info" type="submit">Enter</button>
        </div>
    </form>
</div>

1 个答案:

答案 0 :(得分:0)

是的,有可能。

您需要将ModelFormCreateView一起使用。您的SaleCreateViewSaleCreateForm类应该看起来像这样:

class SaleCreateView(CreateView):
    model = Transaction
    fields = ['amount_sold', 'total_price_sold', 'note']
    form_class = SaleCreateForm

    def get_initial(self, *args, **kwargs):
            initial = super(SaleCreateView, self).get_initial(**kwargs)
            return initial

class SaleCreateForm(forms.ModelForm):
    class Meta:
        model = Sale
        exclude = ('transaction',)

    def __init__(self, *args, **kwargs):
        self.transaction = kwargs.pop('transaction')
        super(SaleCreateForm, self).__init__(*args, **kwargs)

这里是step by step tutorial