簡體   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