【问题标题】:django UpdateView not saving formdjango UpdateView 不保存表单
【发布时间】:2014-02-01 15:29:18
【问题描述】:

我所有的 CreateView 都工作正常,但这个不是(虽然这是 UpdateView)。经过检查,试图找出差异,我发现没有。一定是我仍然想念的东西。

模板:

<form method="POST">{% csrf_token %}
        {{ form.non_field_errors }}
        {{ form.errors }}
        {{ form.make }}
        {{ form.make.errors }}
        {{ form.model}}
        {{ form.model.errors }}
        {{ form.year}}
        {{ form.year.errors }}

            <button type="submit"> Save</button>
            <a href="javascript:close_window();"> Close</a>
    </form>

URLS.py 中的 URL 模式:

url(r'^update/(?P<pk>\w+)/$',UpdateView.as_view(
    model=Vehicles,
    form_class=VehiclesForm,
    success_url="/main/",
    template_name="vehicle_detail.html")),

型号:

from django.db import models


class Vehicles(models.Model):
    stock = models.CharField(max_length=10, blank=False, db_index=True)
    vin = models.CharField(max_length=17, blank=False, db_index=True)
    vinlast8 = models.CharField(max_length=8, blank=False, db_index=True)
    make = models.CharField(max_length=15, blank=False)
    model = models.CharField(max_length=15, blank=False)
    year = models.CharField(max_length=4, blank=False)
    deal = models.IntegerField(blank=False, db_index=True, null=True)
    sold = models.DateField(blank=True, null=True, db_index=True)
    origin = models.ForeignKey('origins.Origins', db_column='origin')
    #origin = models.CharField(max_length=10, blank=True)
    bank = models.ForeignKey('banks.Banks', db_column='bank', null=True)
    vehtype = models.ForeignKey('vehtypes.Vehtypes', db_column='vehtype', verbose_name='Veh Type')
    status = models.ForeignKey('status.Status', db_column='status')
    imported = models.DateField()
    clerk = models.CharField(max_length=10, blank=False, db_index=True, verbose_name='Clerk')
    completed = models.DateField(blank=True, null=True)
    registry = models.IntegerField(blank=True, verbose_name='Reg #', null=True)
    plate = models.CharField(blank=True, null=True, max_length=10)
    tagno = models.IntegerField(blank=True, null=True, verbose_name='Tag #')
    tag_exp = models.DateField(blank=True, null=True, verbose_name='Tag Exp')
    unit_linked = models.IntegerField(blank=False, verbose_name='Link')
    salesperson = models.CharField(max_length=20, blank=False, verbose_name='S/person', null=True)
    agent = models.ForeignKey('agents.Agents', db_column='agent', blank=True, null=True)
    tradein1 = models.CharField(max_length=10, blank=True, null=True, verbose_name='stock')
    tr1vin = models.CharField(max_length=17, blank=True, db_index=True, null=True, verbose_name='vin')
    tr1make = models.CharField(max_length=15, blank=True, null=True, verbose_name='make')
    tr1model = models.CharField(max_length=15, blank=True, null=True, verbose_name='model')
    tr1year = models.CharField(max_length=4, blank=True, null=True, verbose_name='year')
    tradein2 = models.CharField(max_length=10, blank=True, null=True, verbose_name='stock')
    tr2vin = models.CharField(max_length=17, blank=True, db_index=True, null=True,verbose_name='vin')
    tr2make = models.CharField(max_length=15, blank=True, null=True,verbose_name='make')
    tr2model = models.CharField(max_length=15, blank=True, null=True,verbose_name='model')
    tr2year = models.CharField(max_length=4, blank=True, null=True,verbose_name='year')
    lhtrade1 = models.CharField(max_length=15, blank=True, null=True, verbose_name='L/holder')
    lh1docreq = models.DateField(blank=True, null=True, verbose_name='D/Requested')
    lh1docrec = models.DateField(blank=True, null=True, verbose_name='D/Received')
    lhtrade2 = models.CharField(max_length=15, blank=True, null=True, verbose_name='L/holder')
    lh2docreq = models.DateField(blank=True, null=True, verbose_name='D/Requested')
    lh2docrec = models.DateField(blank=True, null=True, verbose_name='D/Received')

    cust1name = models.CharField(max_length=40, blank=True, db_index=True, null=True,
                                     verbose_name='name')
    cust1lic = models.CharField(max_length=20, blank=True, db_index=True, null=True,
                                verbose_name='license')
    cust1addr = models.CharField(max_length=40, blank=True, null=True, verbose_name='address')
    cust1city = models.CharField(max_length=15, blank=True, null=True, verbose_name='city')
    cust1state = models.CharField(max_length=2, blank=True, null=True, verbose_name='state')
    cust1zip = models.CharField(max_length=10, blank=True, null=True, verbose_name='zipcode')
    cust1email = models.EmailField(blank=True, null=True, verbose_name='email')
    cust1tel1 = models.CharField(max_length=15, blank=True, verbose_name='Tel. 1', null=True)
    cust1tel2 = models.CharField(max_length=15, blank=True, verbose_name='Tel. 2', null=True)
    cust1ssn = models.CharField(max_length=12, blank=True, db_index=True, null=True,verbose_name='SSN')

    cust2name = models.CharField(max_length=30, blank=True, db_index=True, null=True,
                                     verbose_name='name')
    cust2lic = models.CharField(max_length=20, blank=True, db_index=True, null=True,
                                verbose_name='license')
    cust2addr = models.CharField(max_length=25, blank=True, null=True, verbose_name='address')
    cust2city = models.CharField(max_length=15, blank=True, null=True, verbose_name='city')
    cust2state = models.CharField(max_length=2, blank=True, null=True, verbose_name='state')
    cust2zip = models.CharField(max_length=10, blank=True, null=True, verbose_name='zipcode')
    cust2email = models.EmailField(blank=True, null=True, verbose_name='email')
    cust2tel1 = models.CharField(max_length=15, blank=True, verbose_name='Tel. 1', null=True)
    cust2tel2 = models.CharField(max_length=15, blank=True, verbose_name='Tel. 2', null=True)
    cust2ssn = models.CharField(max_length=12, blank=True, db_index=True, null=True,verbose_name='SSN')

    class Meta:
        db_table = 'vehicles'

    def __unicode__(self):
        return self.stock

    def save(self, *args, **kwargs):
        self.stock = self.stock.upper()

        return super(Vehicles, self).save(*args, **kwargs)

表格:

from django import forms
from models import Vehicles


class VehiclesForm(forms.ModelForm):
    class Meta:
        model = Vehicles

这是一个模型。 Firebug 和控制台确实报告 POST 确实发生了,但记录没有更新。

感谢任何你发现它是错误的。

【问题讨论】:

  • 它是否重定向到success_url 但还没有保存对象?或者它重新显示表格?您应该在模板中输出表单错误,可能存在验证错误
  • 它只重新显示表单。已将表单错误添加到已编辑的问题中。
  • 那么,您发现任何错误吗?
  • 对不起,我应该指出没有错误。
  • @Anentropic,我刚刚添加了 {{form.errors}} 并注意到在发布时,它列出了所有必填字段。只是为了清除这一点,所有字段(至少是必需的)都在模板的原始版本中。首次呈现模板时,确实填充了所有必填字段。我想知道是否可能由于某些必填字段,它需要一个实例,而不是当前值。只是一个想法。

标签: django forms django-class-based-views


【解决方案1】:

既然没有答案……

首先,由于您不以任何方式修改您的表单,因此您无需指定它 - ModelForm 默认隐含在 UpdateView 中。所以,你不需要这个:

form_class=VehiclesForm

然后,在您的模型(很大)中,您不需要 blank=False - 它也是默认值。

我认为您的问题在于现场验证程序。您的模板 html-form 仅呈现一些字段,但您的模型有更多(重要的是 - 它们不是可选的,并且它们没有默认值)。 因此,您根本看不到验证错误。

如果你像这样渲染整个表单:

<form method="POST">{% csrf_token %}

    {{ form.as_p }}

    <button type="submit"> Save</button>
    <a href="javascript:close_window();"> Close</a>
</form>

...您会看到验证错误!

PS:如果你只想渲染那些字段,你必须:

1) 使用这些字段的列表指定 fields 属性:

# django doc example    
class AuthorUpdate(UpdateView):
        model = Author
        fields = ['name']
        template_name_suffix = '_update_form'

2) 确保您提供所有需要的数据(默认或通过表单字段显式)以保存模型实例。

3) 阅读 Django 文档 - 非常详细和细致,祝你好运!

【讨论】:

    【解决方案2】:

    对我来说,我必须改变

    <form action="." .....>
    

    <form action="" ..... >
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-22
      • 1970-01-01
      • 2017-01-02
      • 2019-06-21
      • 1970-01-01
      • 2021-12-15
      • 2018-02-01
      • 2016-02-28
      相关资源
      最近更新 更多