如何Django的REST框架可以用来渲染模型实例与由用户编辑的特定字段列表?
我是几个月到Django的,只有一两天到DRF。 我尝试过几种不同的方法,但似乎无法环绕它我的头。
在此之前使用DRF,我的工作流程将是建立一个视图(以及相关的URL)认为:查询我的模型,从forms.py(只露出我所需要的字段)拿了我的自定义表单,把二者连成一本字典,并把它交给一个模板。
在模板,然后我可以依次通过我的模型实例,并建立了我的编辑字段,通过Django的酥脆形式管路他们,因为需要。
然后,我可以通过一个AJAX get请求调用这个模板。
models.py
class Buyer(models.Model):
name = models.CharField(unique=True, max_length = 20)
class Item(models.Model):
name = models.CharField(unique=True, max_length = 50)
active = models.BooleanField(default=True)
bought_by = models.ForeignKey(Buyer, null=True, blank=True, to_field="name",)
views.py
class ItemViewSet(viewsets.ModelViewSet):
queryset = models.Item.objects.select_related("bought_by")
serializer_class= serializers.ItemSerializer
filterset_fields = ("bought_by")
serializers.py
class ItemSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = models.Item
fields = "__all__"
extra_kwargs = {"url": {"view_name: "myapp:item-detail"}}
urls.py
router = routers.DefaultRouter()
router.register(r"items", views.ItemViewSet)
template.html
{% load static %}
{% load rest_framework %}
<table id="item_table" class="table">
<thead>
<tr>
<th scope="col">Name</th>
<th scope="col">Active</th>
<th scope="col">Buyer</th>
</tr>
</thead>
<tbody>
{% for item in data %}
<tr scope="row">
<td>{{ item.name }}</td>
<td>{{ item.active }}</td>
<td>{{ item.bought_by }}</td>
</tr>
{% endfor %}
</tbody>
</table>
一些JS文件
function getData(){
updateRequest = $.ajax({
type: "GET",
url: "myapp/items/",
success: function(data) {
//....
}
});
}
第一种方法:自定义ListModelMixin为ItemViewSet呈现模板,并沿着串行传递。 沿着线的东西:
def list(self,request, *args, **kwargs):
...
return Response ({'data': queryset, 'serializer': serializer}, template_name = "myapp/template.html")
然后在template.html变化{{item.active}}到:
<form action="{{ item.url }}" method="post">
{% csrf_token %}
{{ render_form serializer }}
</form>
错误:串行不迭代。 说得通。 将其改为:
{{ render_field item.bought_by }}
错误:需要“风格”,补充说。 继续获得其他错误
第二条本办法:试着修改ListModelMixin收集序列化模型实例的字典例如,:
items= dict()
for item in queryset:
items[item] = serializers.ItemSerializer(item, data=request.data)
从来没有完全想通了这一点作为serializers.ItemSerializer(项数据= request.data)似乎没有成为一个字典项目,因此无法使用data.items()通过它在模板中进行迭代。
对于长写的道歉,但我有点在海上,而不是很清楚如何进行。
什么是某些字段可编辑(类似于你将如何在与list_editable指定Django管理)返回所有模型实例的列表的最优雅的方式DRF?
我总是老的方式,但感觉就像我失去了一些东西明显与DRF这里。
参考文献:
https://www.django-rest-framework.org/topics/html-and-forms/
Django的REST框架串行单独呈现形式
渲染与APIView的Django的REST框架的ModelViewSet类INSEAD形式