无法使用 Crispy Forms 通过外键上传数据
Cannot upload data through a foreign keys with Crispy Forms
我显示类别和子类别的值,从那里获取值并将其保存为新闻实体中的外键。
models.py
class News(models.Model):
name = models.CharField(max_length=50)
pic = models.ImageField()
catid = models.ForeignKey(SubCat, on_delete = models.DO_NOTHING)
class Cat(models.Model):
name = models.CharField(max_length=50)
class SubCat(models.Model):
name = models.CharField(max_length=50)
catid = models.ForeignKey(Cat, on_delete = models.CASCADE)
add_news.html
<label class="col-md-1 control-label" for="example-text-input">Text Input</label>
<div class="col-md-5">
<input id="newstitle" name="newstitle" type="text" class="form-control" placeholder=".col-md-7">
</div>
<select id="newscat" name="newscat" class="select-chosen" data-placeholder="Choose a Category.." style="width: 250px;">
{% for i in subcat %}
<option value="{{ i.pk }}">{{ i.catid.name }} | {{ i.name }}</option>
{% endfor %}
</select>
image
然后我使用查询获取了所有值并像这样保存它们:
views.py
@login_required(login_url='mylogin')
def news_add(request):
subCat = SubCat.objects.all()
catID = request.POST['newscat']
if request.method == 'POST':
newstitle = request.POST['newstitle']
newCatID = SubCat.objects.get(pk=catID)
pic= request.FILES['picture']
news = News(name=newstitle, catid=newCatID, pic=pic)
...
news.save()
else:
return render(request, 'back/news_add.html', {'subcat' : subCat})
但是,现在我如何使用 crispy 表单 来显示带有子类别的相同类别列表并将其保存在我的模型中PK(猫)?
所以,我只能显示这个
add_news.html
<div class="col-md-5">
{{ form.name|as_crispy_field }}
</div>
<div class="col-md-5">
{{ form.pic|as_crispy_field }}
</div>
<div class="col-md-5">
{{ form.catid.name|as_crispy_field }} {{ form.name|as_crispy_field }} # Not possible
</div>
forms.py
class NewsForm(ModelForm):
class Meta:
model = News
fields = ['name', 'pic', 'catid',]
labels = {'name': _('Title'),
'catid': _(''),
'pic': _('picture'),
}
views.py
@login_required(login_url='mylogin')
def news_add(request):
subCat = SubCat.objects.all()
if request.method == 'POST':
form = NewsForm(request.POST, request.FILES)
if form.is_valid():
new = form.save()
new.save()
#form.save_m2m()
return redirect('news_list')
else:
form = NewsForm()
#newCatID = get_object_or_404(SubCat, pk = catID)
return render(request, 'back/news_add.html', {'form':form, 'subcat' : subCat})
我把我的问题描述的尽量详细了,因为我已经想了好几天了
也许始终将 SubCat 与 Cat 一起显示是有意义的:
class SubCat(models.Model):
name = models.CharField(max_length=50)
catid = models.ForeignKey(Cat, on_delete = models.CASCADE)
def __str__(self):
return "{} | {}".format(self.catid.name, self.name)
我显示类别和子类别的值,从那里获取值并将其保存为新闻实体中的外键。
models.py
class News(models.Model):
name = models.CharField(max_length=50)
pic = models.ImageField()
catid = models.ForeignKey(SubCat, on_delete = models.DO_NOTHING)
class Cat(models.Model):
name = models.CharField(max_length=50)
class SubCat(models.Model):
name = models.CharField(max_length=50)
catid = models.ForeignKey(Cat, on_delete = models.CASCADE)
add_news.html
<label class="col-md-1 control-label" for="example-text-input">Text Input</label>
<div class="col-md-5">
<input id="newstitle" name="newstitle" type="text" class="form-control" placeholder=".col-md-7">
</div>
<select id="newscat" name="newscat" class="select-chosen" data-placeholder="Choose a Category.." style="width: 250px;">
{% for i in subcat %}
<option value="{{ i.pk }}">{{ i.catid.name }} | {{ i.name }}</option>
{% endfor %}
</select>
image 然后我使用查询获取了所有值并像这样保存它们:
views.py
@login_required(login_url='mylogin')
def news_add(request):
subCat = SubCat.objects.all()
catID = request.POST['newscat']
if request.method == 'POST':
newstitle = request.POST['newstitle']
newCatID = SubCat.objects.get(pk=catID)
pic= request.FILES['picture']
news = News(name=newstitle, catid=newCatID, pic=pic)
...
news.save()
else:
return render(request, 'back/news_add.html', {'subcat' : subCat})
但是,现在我如何使用 crispy 表单 来显示带有子类别的相同类别列表并将其保存在我的模型中PK(猫)?
所以,我只能显示这个
add_news.html
<div class="col-md-5">
{{ form.name|as_crispy_field }}
</div>
<div class="col-md-5">
{{ form.pic|as_crispy_field }}
</div>
<div class="col-md-5">
{{ form.catid.name|as_crispy_field }} {{ form.name|as_crispy_field }} # Not possible
</div>
forms.py
class NewsForm(ModelForm):
class Meta:
model = News
fields = ['name', 'pic', 'catid',]
labels = {'name': _('Title'),
'catid': _(''),
'pic': _('picture'),
}
views.py
@login_required(login_url='mylogin')
def news_add(request):
subCat = SubCat.objects.all()
if request.method == 'POST':
form = NewsForm(request.POST, request.FILES)
if form.is_valid():
new = form.save()
new.save()
#form.save_m2m()
return redirect('news_list')
else:
form = NewsForm()
#newCatID = get_object_or_404(SubCat, pk = catID)
return render(request, 'back/news_add.html', {'form':form, 'subcat' : subCat})
我把我的问题描述的尽量详细了,因为我已经想了好几天了
也许始终将 SubCat 与 Cat 一起显示是有意义的:
class SubCat(models.Model):
name = models.CharField(max_length=50)
catid = models.ForeignKey(Cat, on_delete = models.CASCADE)
def __str__(self):
return "{} | {}".format(self.catid.name, self.name)