【问题标题】:Django Key Error on Form Submit When Overriding Get_Initial on CreateView覆盖 CreateView 上的 Get_Initial 时表单提交上的 Django 键错误
【发布时间】:2014-01-02 12:40:57
【问题描述】:

我有一个通用的 CreateView,它使用一些默认值及其父对象的主键值填充表单。表单已正确填充,但在提交时会为 lumberload_id 引发 KeyError。

调试表明它覆盖了 GET 和 POST 上的 get_initial 方法,这意味着它会尝试访问在提交表单时不再存在的 lumberload 对象。

在我看来,回发时不需要 get_initial,因为它已经在 GET 上完成了它的工作。有没有办法在 POST 上跳过覆盖 get_initial ?我未能尝试将覆盖包装在:

if request.method == 'GET':

网址:

 url(r'^lumber_load/(?P<pk>\d+)/addlog/$', views.LogDataCreate.as_view(), name='log-data-add'),

查看: 类 LogDataCreate(CreateView): form_class= LogDataForm 模型 = 日志数据

    # Set created_by to the current user.
    def form_valid(self, form):
        form.instance.created_by = self.request.user
        return super(LogDataCreate, self).form_valid(form)

    # Set initial values of unit fields.
    def get_initial(self):
        return { 'lumberload': self.kwargs['lumberload_id'],'diameter_unit': '3', 'length_unit': '1' }

    # Return to the load list when done creating a plot.
    def get_success_url(self):
        return reverse('geoapp:lumber_load_list')

型号:

 class LogData(models.Model):
    logdata_id = models.AutoField(primary_key=True)
    lumberload = models.ForeignKey('LumberLoad', blank=True, null=True)
    butt_diameter = models.DecimalField(null=True, max_digits=4, decimal_places=1, blank=True)
    diameter_unit = models.ForeignKey('UnitLengthType', related_name='diameter_unit', null=True)
    log_length = models.DecimalField(null=True, max_digits=3, decimal_places=1, blank=True)
    length_unit = models.ForeignKey('UnitLengthType', related_name='length_unit', null=True)
    speciestreetype = models.ForeignKey('SpeciesTreeType', blank=True, null=True)
    recorded_date = models.DateField(blank=True, null=True)
    created_by = models.ForeignKey(User)
    class Meta:
        db_table = 'log_data'
        ordering = ["logdata_id"]
    def __unicode__(self):
        return unicode(self.logdata_id)

【问题讨论】:

  • 我也试过了: def dispatch(self, *args, **kwargs): self.lumberLoad = get_object_or_404(LumberLoad, pk=kwargs['lumberload_id']) return super(LogDataCreate, self).dispatch(*args, **kwargs) # Set initial values of unit fields. def get_initial(self): # return { 'lumberload': self.kwargs['lumberload_id'],'diameter_unit': '3', 'length_unit': '1' } return { 'lumberload': self.lumberLoad.lumberload_id, 'diameter_unit': '3', 'length_unit': '1' }

标签: django forms


【解决方案1】:

试试这个方法:

def get_initial(self):
    if self.request.method == 'GET':
        return #initial data
    else:
        return {}

【讨论】:

  • 太好了,我曾尝试将请求方法的测试包装在“def get_initial(self)”周围,而不是将其放在覆盖中。谢谢!!!!!!
猜你喜欢
  • 2018-11-24
  • 1970-01-01
  • 1970-01-01
  • 2015-03-24
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多