django - 预填充generec createview
问题描述
我希望表格中包含数据
我的模型:
TYPE = (("S",'Swing'),
("R","Rapide"))
class valuation(models.Model):
stock = models.ForeignKey("stock",on_delete=models.CASCADE,related_name='valuation',)
date = models.DateField(auto_created=True)
val_type = models.CharField(choices=TYPE, max_length=1,default='R')
user = models.ForeignKey("users.User", on_delete=models.CASCADE)
def __str__(self):
return f"{self.stock} - {self.date} - {self.val_type}"
我的观点:
class valuationCreateviewSwing(CreateView):
template_name = "evaluation/evaluation_create.html"
form_class = valuationModeform
def get_form_kwargs(self): # prepopulate form
kwargs = super(valuationCreateviewSwing, self).get_form_kwargs()
stck = get_object_or_404(stock, pk=self.kwargs['pk'])
kwargs['user'] = self.request.user
kwargs['val_type'] = "S"
kwargs['stock'] = stck
return kwargs
def get_context_data(self, **kwargs):
# we need to overwrite get_context_data
# to make sure that our formset is rendered
data = super().get_context_data(**kwargs)
if self.request.POST:
data["val_detail"] = ChildFormset1(self.request.POST)
else:
data["val_detail"] = ChildFormset1()
data.update({
"typeVal": "Swing",})
return data
def form_valid(self, form):
context = self.get_context_data()
val_detail_Swing = context["val_detail_Swing"]
self.object = form.save(commit=False)
# add data info neede about valuation model
self.object = form.save()
if val_detail_Swing.is_valid():
val_detail_Swing.instance = self.object
val_detail_Swing.save()
return super().form_valid(form)
def get_success_url(self):
return reverse("stock:stock-list")
我认为我有一个子表单(这部分工作正常):
ChildFormset1 = inlineformset_factory(
valuation, val_detail_Swing, form=valuationSwingModelform, can_delete=False)
我尝试使用 ge_for_kwargs 但它似乎不起作用,因为我收到一条错误消息: init () got an unexpected keyword argument 'user'
解决方案
您可以使用get_initial()
方法:
class valuationCreateviewSwing(CreateView):
template_name = "evaluation/evaluation_create.html"
form_class = valuationModeform
def get_initial(self):
query = self.request.GET
return {
'user': self.request.user.pk
'val_type': "S",
'stock': self.kwargs.get('pk')
}
...
或者您应该覆盖__init__()
方法并继续使用get_form_kwargs()
class valuationModeform(ModelForm):
class Meta:
model = Valuation
fields = '__all__'
def __init__(self, *args, **kwargs):
user = kwargs.pop('user', None)
val_type = kwargs('val_type', None)
stock = kwargs.pop('stock', None)
super().__init__(*args, **kwargs)
# assign initial values
self.fields['user'].initial = user
self.fields['val_type'].initial = val_type
self.fields['stock'].initial = stock
推荐阅读
- google-cloud-platform - Google Cloud Console 上的项目 xxxx 超出了 TPU 配额
- javascript - 如何在 Onclick html 函数中使用它?
- c++ - “while(node!=NULL&&node->next!=NULL)”在链表中表示什么。如何有效地使用它
- javascript - 如何从标签下拉角度 8 中的数组对象中选择一个值?
- javascript - Django Javascript Ajax - 提交表单什么都不做
- php - 如何使用 3 或 if 条件 PHP ?我的意思是如果( a 或 b 或 c )
- r - 在R中将汇总数据重塑为垂直且整齐的数据
- python - Django 匹配查询不存在,但我得到打印
- json - 将数据模型从一个视图控制器传递到另一个视图控制器
- facebook - Facebook 看不到 OG 标签。另一个社交工作正确