簡體   English   中英

Django UpdateView-由於POST調用而沒有對象

[英]Django UpdateView - no object due to POST call

我有兩個UpdateView,一個可以使用,另一個不可以... 請參閱更新IV

工作模型是:

views.py

class JuryUpdate(UpdateView):
    model = Jury
    fields = [
        'jury_name',
        ]
    template_name_suffix = '_update_form'

    def get_object(self, *args, **kwargs):
        return get_object_or_404(Jury, jury_id=self.kwargs['jr'])

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        form.instance.court_year = self.kwargs['yr']
        form.instance.jury_id = self.kwargs['jr']
        return super(JuryUpdate, self).form_valid(form)

templates / jury_update_form.html (相關部分)

<div class="container">
    <h5>Update {{for.instance.jury_name}}</h5>
    <form method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Save" />
    </form>
</div>

此設置將呈現帶有對象標簽和來自該對象的現有字段數據的updateview。 此下一個設置不起作用...

views.py

class CustomerUpdate(UpdateView):
    model = Customer
    fields = [
        'customer',
        ]
    template_name_suffix = '_update_form'

    def get_object(self, *args, **kwargs):
        return get_object_or_404(Customer, customer_id=self.kwargs['pk'])

    def form_valid(self, form):
        form.instance.customer_id = self.kwargs['pk']
        return super(CustomerUpdate, self).form_valid(form)

templates / customer_update_form.html (相關部分)

<div class="container">
    <h5>Update {{form.instance.customer}}</h5>
    <form method="post">{% csrf_token %}
        {{ form.as_p }}
        <input type="submit" value="Save" />
    </form>
</div>

第二個updateview確實提供了一個更新表單,但未填充調用對象的數據。 該對象似乎在那里,因為{{form.instance.customer}}包含了該呼叫的正確customer數據(與JuryUpdate視圖相同)。

我試着顯式調用get_initial (如描述這里 )和打印,但結果是{} 我也嘗試了form_valid調用的變體,但是如上所述,我相信我得到了正確的對象。 有幾個示例(例如here )使用get_initial來預先填充現有信息-但這在此實例中不起作用,並且在我的JuryUpdate視圖中不需要。

任何幫助表示贊賞。

更新我

models.py

class Customer(models.Model):

    class Meta:
        verbose_name = "Customer"
        verbose_name_plural = "Customers"

    customer_id = models.AutoField(
        primary_key=True)

    customer = models.CharField(
        max_length=40)

    # table fields

    def get_absolute_url(self):
        return reverse(
            'customer-detail-view', 
            kwargs={'pk':self.pk})

    def __str__(self):
        return self.customer

class Jury(models.Model):

    class Meta:
        verbose_name = "Jury"
        verbose_name_plural = "Juries"

    customer = models.ForeignKey(
        Customer,
        on_delete=models.CASCADE)

    court_year = models.ForeignKey(
        CourtYear,
        on_delete=models.CASCADE)

    jury_id = models.AutoField(
        primary_key=True)

    jury_name  = models.CharField(
        max_length=20)

    # other table fields

    def get_absolute_url(self):
        return reverse(
            'jury-list-view', 
            kwargs={'pk':self.customer_id, 'yr':self.court_year_id})

    def __str__(self):
        return self.jury_name

urls.py

path('add_customer/', views.CustomerCreate.as_view(), name='customer-add'),
path('<int:pk>/', views.CustomerDetailView.as_view(), name='customer-detail-view'),
path('<int:pk>/delete/', views.CustomerDelete.as_view(), name='customer-delete'),   
path('<int:pk>/update/', views.CustomerUpdate.as_view(), name='customer-update'),

path('<int:pk>/<int:yr>/', views.JuryListView.as_view(), name='jury-list-view'),
path('<int:pk>/<int:yr>/add_jury/', views.JuryCreate.as_view(), name='jury-add'),
path('<int:pk>/<int:yr>/<int:jr>/updatejury', views.JuryUpdate.as_view(), name='jury-update'),
path('<int:pk>/<int:yr>/<int:jr>/deletejury', views.JuryDelete.as_view(), name='jury-delete'),

更新二

我已經將get_initial()方法添加到我的CustomerUpdate(UpdateView) ,如下所示:

def get_initial(self):

    initial = super(CustomerUpdate, self).get_initial()
    print('initial data', initial)

    customer_object = self.get_object()

    initial['customer'] = customer_object.customer
    # other fields omitted...

    print('initial data updated', initial)

    return initial

initial data打印返回{} initial data updated打印返回{'customer': 'John Doe'} (加上“其他字段”)。 因此,似乎正確的信息正在被提取和傳遞-必須在html

更新三

我已經將CustomerUpdate(UpdateView)簡化為非常基本的類模型:

class CustomerUpdate(UpdateView):
    model = Customer
    fields = [
        'customer',
        ]
    template_name_suffix = '_update_form'

模板已經是基本格式( docs )-呈現的網頁仍然沒有用於更新的對象數據...

更新四

我想我已經解決了問題-但不知道如何解決...

當我使用JuryUpdate調用時,控制台顯示:

[02/Jun/2018 16:19:19] "GET /myapp/1/3/9/updatejury/?csrfmiddlewaretoken=1kHK4xgqdbBfXsv6mtz0WKgKpewFwLVtpUX5Z51qnLsGaMDVmpdVHKslXAXPhvY8 HTTP/1.1" 200 3687

當我使用CustomerUpdate調用時,控制台顯示:

[02/Jun/2018 16:18:57] "POST /myapp/5/update/ HTTP/1.1" 200 3354

因此,我對Jury更新的updateview是GET調用,而我對Customer的udpateview是POST調用。 在瀏覽文檔時,我可以看到GET調用顯示了數據,而POST調用是(我認為)假設黑色數據集。 我不知道為什么會得到不同的結果-在哪里設置/更改?

3天后-我找到了問題-它與視圖,模型,URL或更新模板無關。 令人反感的代碼實際上已附加到更新按鈕上。 具體地說,具有“更新”按鈕的頁面使用以下<form>代碼:

<form action="{% url 'customer-update' pk=customer.client_id %}" method="post" style="display: inline;">
    {% csrf_token %}
    <button type="submit" class="btn btn-outline-primary btn-custom-xs">U</button>
</form>

在表單調用中,使用的方法是"POST" -盡管我不完全了解內部調用,但結果是空白的UpdateView。 調用頁面中的以下代碼解決了該問題。

<form action="{% url 'customer-update' pk=customer.client_id %}" style="display: inline;">
    {% csrf_token %}
    <button type="submit" class="btn btn-outline-primary btn-custom-xs">U</button>
</form>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM