比方说在编辑某一项时,我希望把它的id传过去。
我该怎么做?
答:(1)在urls.py
中写个正则表达式,如:path('user/<int:nid>/edit/', views.user_edit),
这样在向该地址发送请求时,中间必须有个值
(2)在views.py
中要加入参数nid
,如
def user_edit(request, nid):
return render(request, 'user_edit.html')
(3)上面这两个都是针对编辑模块的,对于如何在如上图中的管理页面如何获取到id这件事,当然要把代码写在管理页面在对应的HTML文件中。
<tbody>
{% for obj in queryset %}
<tr>
<th scope="row">{{ obj.id }}</th>
<td>
<a class="btn btn-primary btn-sm" href="/user/{{ obj.id }}/edit/">编辑</a>
<a class="btn btn-primary btn-sm" href="/user/delete/?did={{ obj.id }}">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
至于queryset哪儿来的?当然是该HTML文件对应的views.py
传过去的咯~~return render(request, 'user_list.html', {'queryset': queryset})
4.如何将输入的值传到服务器?
比方说编辑用户名的后端代码,如:
class AdminEditForm(forms.ModelForm):
class Meta:
model = models.Admin
fields = ['username']
def admin_edit(request, nid):
row_objects = models.Admin.objects.filter(id=nid).first()
if request.method == 'GET':
form = AdminEditForm(instance=row_objects)
return render(request, 'admin_edit.html', {'form': form})
form = AdminEditForm(data=request.POST, instance=row_objects)
if form.is_valid():
form.save()
return redirect('/admin/list')
return render(request, 'admin_edit.html', {'form': form})
在 Django 中,ModelForm 用于创建和编辑数据库模型的实例。当使用这个表单来编辑一个已经存在的模型实例时,需要告诉 Django 正在编辑哪个特定的实例。这是通过在创建 ModelForm 实例时传递 instance 参数来实现的。
当处理 GET 请求(即初次加载表单)时,传递 instance=row_objects 的用意是告诉 Django 表单应该显示 row_objects(即 models.Admin 中 id=nid 的那个实例)的当前数据。
在处理 POST 请求(即表单提交)时,如果没有传递 instance 参数。则 Django 会认为这是一个新的实例创建请求,而不是对现有实例的更新。
在处理 POST 请求时也传递 instance=row_objects 参数, Django 就可以知道希望更新的是哪个数据库中的实例。