Django - 使createview保存两个不同的模型
Django - make createview save two different models
我正在尝试让 Django 在通过 CreatView 创建第一个模型时自动创建第二个模型的实例:
models.py
class MAG_magazyn(models.Model): #1st
nr_ident=models.CharField(max_length=50, unique=True)
nazwa=models.CharField(max_length=50)
typ=models.CharField(max_length=50, blank=True, null=True)
podzespol=models.BooleanField(default=False)
kategoria=models.ForeignKey(MAG_kategorie_czesci)
class MAG_magazyn_stan(models.Model): #2nd
id_czesc=models.OneToOneField(MAG_magazyn)
regal=models.CharField(max_length=3)
polka=models.CharField(max_length=3)
stan_min=models.IntegerField()
stan=models.IntegerField()
alert=models.IntegerField(default=0)
rel_stan=models.DecimalField(...)
现在,由于这些模型已连接,我想添加具有一些默认值的 2nd 实例。我的想法是覆盖 form_valid,获取第一个模型的最后一个 ID,然后创建并保存第二个实例:
Class NowyMag (CreateView):
'''
Widok pozwalajacy na dodanie nowej czesci magazynowej do listy
'''
model=MAG_magazyn
fields=[
(...),
]
template_name='magazyn/nowy_mag.html'
success_url=reverse_lazy('mag_lista_mag')
def form_valid(self, form):
form.save( )
nowy_stan=MAG_magazyn_stan(id_czesc=MAG_magazyn.objects.latest('id').id, regal=0,polka=0,stan_min=0,stan=0, alert=1)
nowy_stan.save()
return super(NowyMag, self).form_valid(form)
但我得到的只是:
Exception Type: ValueError
Exception Value: Cannot assign "20": "MAG_magazyn_stan.id_czesc" must be a "MAG_magazyn" instance.
我的想法是否正确,但有误,或者有一些更简洁的方法可以让这样的东西工作?
一点更好的解释:
在创建 MAG_magazyn 的实例时,我想自动创建 MAG_magazyn_stan,其 ID 为 MAG_magazyn 和一些默认值(此处均等于 0)
您的问题不是很清楚,但我假设您使用的是与 MAG_magazyn
相关联的表单,在这种情况下,您想执行以下操作:
def form_valid(self, form):
# You need to get a new object based on the form
self.object = form.save(commit=False)
... # in case you want to modify the object before commit
self.object.save()
# not you can use it to assign to the second model
nowy_stan=MAG_magazyn_stan(id_czesc=self.object, ...)
nowy_stan.save()
return HttpResponseRedirect(self.get_absolute_url) # or elsewhere
我正在尝试让 Django 在通过 CreatView 创建第一个模型时自动创建第二个模型的实例:
models.py
class MAG_magazyn(models.Model): #1st
nr_ident=models.CharField(max_length=50, unique=True)
nazwa=models.CharField(max_length=50)
typ=models.CharField(max_length=50, blank=True, null=True)
podzespol=models.BooleanField(default=False)
kategoria=models.ForeignKey(MAG_kategorie_czesci)
class MAG_magazyn_stan(models.Model): #2nd
id_czesc=models.OneToOneField(MAG_magazyn)
regal=models.CharField(max_length=3)
polka=models.CharField(max_length=3)
stan_min=models.IntegerField()
stan=models.IntegerField()
alert=models.IntegerField(default=0)
rel_stan=models.DecimalField(...)
现在,由于这些模型已连接,我想添加具有一些默认值的 2nd 实例。我的想法是覆盖 form_valid,获取第一个模型的最后一个 ID,然后创建并保存第二个实例:
Class NowyMag (CreateView):
'''
Widok pozwalajacy na dodanie nowej czesci magazynowej do listy
'''
model=MAG_magazyn
fields=[
(...),
]
template_name='magazyn/nowy_mag.html'
success_url=reverse_lazy('mag_lista_mag')
def form_valid(self, form):
form.save( )
nowy_stan=MAG_magazyn_stan(id_czesc=MAG_magazyn.objects.latest('id').id, regal=0,polka=0,stan_min=0,stan=0, alert=1)
nowy_stan.save()
return super(NowyMag, self).form_valid(form)
但我得到的只是:
Exception Type: ValueError
Exception Value: Cannot assign "20": "MAG_magazyn_stan.id_czesc" must be a "MAG_magazyn" instance.
我的想法是否正确,但有误,或者有一些更简洁的方法可以让这样的东西工作?
一点更好的解释: 在创建 MAG_magazyn 的实例时,我想自动创建 MAG_magazyn_stan,其 ID 为 MAG_magazyn 和一些默认值(此处均等于 0)
您的问题不是很清楚,但我假设您使用的是与 MAG_magazyn
相关联的表单,在这种情况下,您想执行以下操作:
def form_valid(self, form):
# You need to get a new object based on the form
self.object = form.save(commit=False)
... # in case you want to modify the object before commit
self.object.save()
# not you can use it to assign to the second model
nowy_stan=MAG_magazyn_stan(id_czesc=self.object, ...)
nowy_stan.save()
return HttpResponseRedirect(self.get_absolute_url) # or elsewhere