我有以下模型,查看和模板:
models.py:
class Batch(models.Model):
material_id = models.ManyToManyField(AssetMetadata)
user = models.ForeignKey(User)
def __str__(self):
return 'Batch_' + str(self.pk) + '_' + self.user.username
class AssetMetadata(models.Model):
material_id = models.CharField(max_length=256, blank=True)
series_title = models.CharField(max_length=256, blank=True)
season_title = models.CharField(max_length=256, blank=True)
season_number = models.IntegerField(default=0)
episode_title = models.CharField(max_length=256, blank=True)
episode_number = models.IntegerField(default=0)
synopsis = models.TextField(max_length=1024, blank=True)
ratings = models.CharField(max_length=256, blank=True)
def __str__(self):
return self.material_id
views.py:
def assets_in_repo(request):
asset_list = AssetMetadata.objects.order_by('id').all()
page = request.GET.get('page', 1)
paginator = Paginator(asset_list, 50)
try:
assets = paginator.page(page)
except PageNotAnInteger:
assets = paginator.page(1)
except EmptyPage:
assets = paginator.page(paginator.num_pages)
if request.method == 'POST':
batch_list = request.POST.getlist('batch')
print(batch_list)
return render(request, 'assets_db/assets.html', {'assets': assets})
模板的摘要:
<form method="post">{% csrf_token %}
<input type="submit" value="Create Batch" align="right">
<table class="table table-striped" id="myTable">
<tr>
<th>ID</th>
<th>Material ID</th>
<th>Series Title</th>
<th>Season Tile</th>
<th>Season Number</th>
<th>Episode Title</th>
<th>Episode Number</th>
<th>Create Batch</th>
</tr>
{% for i in assets %}<tr>
<td>{{i.pk}}</td>
<td><a href="/repo/{{ i.id}}">{{i.material_id}}</a></td>
<td>{{i.series_title}}</td>
<td>{{i.season_title}}</td>
<td>{{i.season_number}}</td>
<td>{{i.episode_title}}</td>
<td>{{i.episode_number}}</td>
<td>
<input type="checkbox" name="batch" value="{{i.pk}}">
</td>
</tr>{% endfor %}
</table>
</form>
我试图从复选框中获取数据并将其保存在Batch
模型中。
用户选择资产来创建批处理,表单返回AssetMetadata
中这些资产的pk
,并且选择在列表中存储在通过batch_list = request.POST.getlist('batch')
创建的列表中。我想使用该列表中存储的数据来创建Batch
中的新条目,然后链接到AssetMetadata
中的资产pk
。
我已经能够在Django管理页面上成功完成此操作,但理想情况下,我可以在Teh View中这样做。
我已经阅读了https://docs.djangoproject.com/en/1.10/ref/models/relations/和search stackoverflow,但我很困惑。
info = Batch.objects.create(season_title ='foo', .....)
info2= AssetMetadata.objects.create(material_id ='some')
info.material_id.add(info2)
尝试这样的东西
我认为你需要
obj = AssetMetadata.objects.get(id=pk)
obj.batch_set.add(* batch_list)
感谢两个答案的帮助,我能够使这个工作,这就是我的工作方式:
def assets_in_repo(request):
asset_list = AssetMetadata.objects.order_by('id').all()
page = request.GET.get('page', 1)
paginator = Paginator(asset_list, 50)
try:
assets = paginator.page(page)
except PageNotAnInteger:
assets = paginator.page(1)
except EmptyPage:
assets = paginator.page(paginator.num_pages)
if request.method == 'POST':
batch_list = request.POST.getlist('batch')
info = Batch.objects.create(user_id=request.user.id)
for item in batch_list:
info.material_id.add(item)