繁体   English   中英

通过 URL 参数以通用形式设置初始字段值

[英]Setting initial field value in generic form through URL parameter

我正在努力根据 Django 3.0 中的 URL 参数在表单实例中设置初始值。

我有一个Claim model:

# models.py

class Claim(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(default=timezone.now)
    member = models.ForeignKey(User, on_delete=models.CASCADE)

我有一个基于 ModelForm 的NewClaimForm

# forms.py

class NewClaimForm(forms.ModelForm):
    class Meta:
        model = Claim
        fields = ['product', 'text']

我有一个基于 CreateView 的NewClaimView

# views.py

class NewClaimView(LoginRequiredMixin, CreateView):
    model = Claim
    form_class = NewClaimForm
    template_name = 'portal/new_claim.html'

    def form_valid(self, form):
        form.instance.member = self.request.user
        return super(NewClaimView, self).form_valid(form)

并在索引页面上使用以下模板片段......

# index.html

    <div class="card-deck">
        {% for product in products %}
            <div class="card text-center">
                <div class="card-header">
                    <h5 class="card-title text-primary">{{ product }}</h5>
                </div>
                <div class="card-body">
                    <ol class="card-text text-left">
                        <li>Fill in the {{ product }} form</li>
                        <li>Attach your medical records</li>
                        <li>Get your claim reviewed within 48 hours</li>
                    </ol>
                    <a href="{% url 'portal:new_claim_product' product_id=product.id %}" class="btn btn-primary">Online Form</a>
                </div>
            </div>
        {% endfor %}
    </div>

...我将 product_id 参数传递给 URL:

# urls.py

app_name = 'portal'
urlpatterns = [
    path('new_claim/<int:product_id>/', NewClaimView.as_view(), name='new_claim_product'),
]

最后,这是我的new_claim模板的样子:

# new_claim.html

{% extends "portal/base.html" %}
{% load bootstrap4 %}

{% block content %}
    <p>Submit a new claim</p>

    <form action="{% url 'portal:new_claim' %}" method='post' class="form" enctype="multipart/form-data">
        {% csrf_token %}
        {% bootstrap_form form %}
        {% buttons %}
            <button name="submit">Submit claim</button>
        {% endbuttons %}
    </form>

{% endblock content %}

我现在想使用product_id根据product_id设置表单实例中product字段的初始值。 我怎样才能做到这一点?

通过修改我的基于类的视图的 get 方法来弄清楚如何做到这一点:

# views.py

class NewClaimView(LoginRequiredMixin, CreateView):
    model = Claim
    form_class = NewClaimForm
    template_name = 'portal/new_claim.html'

    def get(self, request, product_id=None, *args, **kwargs):
        form = self.form_class(initial={'product': product_id})
        return render(request, self.template_name, {'form': form})

    def form_valid(self, form):
        form.instance.member = self.request.user
        return super(NewClaimView, self).form_valid(form)

是相关文档的链接

这是解决此问题的最佳方法吗?

我需要修改后的 get 方法中的 *args 和 **kwargs 吗? 我没有在我的代码中使用它们,但将来将它们保留在那里用于其他目的可能会很有用?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM