【发布时间】: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' }