我有一种情况,其中序列化器字段的值取决于当前登录用户的身份.我已经看到了在初始化序列化程序时如何将用户添加到上下文中,但是我不确定在使用ViewSet时如何执行此操作,因为您只提供序列化程序类而不是实际的序列化程序实例.
基本上我想知道如何去:
class myModelViewSet(ModelViewSet):
queryset = myModel.objects.all()
permission_classes = [DjangoModelPermissions]
serializer_class = myModelSerializer
Run Code Online (Sandbox Code Playgroud)
至:
class myModelSerializer(serializers.ModelSerializer):
uploaded_by = serializers.SerializerMethodField()
special_field = serializers.SerializerMethodField()
class Meta:
model = myModel
def get_special_field(self, obj):
if self.context['request'].user.has_perm('something.add_something'):
return something
Run Code Online (Sandbox Code Playgroud)
很抱歉,如果它是不明确的,从文档: 添加额外的Context 它说做
serializer = AccountSerializer(account, context={'request': request})
serializer.data
Run Code Online (Sandbox Code Playgroud)
但我不知道如何从视图集自动执行此操作,因为我只能更改序列化程序类,而不是序列化程序实例本身.
我如何使用list_route方法中的分页?我有看法:
class view(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
viewsets.GenericViewSet):
...
@list_route(methods=['get'])
def some_method(self, request, **kwargs):
queryset = Model.objects.all()
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
Run Code Online (Sandbox Code Playgroud) 我的页面上有以下代码:
<div class="row column filter-tab">
<div id="filter-button" class="button"><%= fa_icon 'filter' %></div>
</div>
Run Code Online (Sandbox Code Playgroud)
我有一个试图做的rspec测试
page.find('#filter-button').click
Run Code Online (Sandbox Code Playgroud)
我收到了可怕的
Capybara::ElementNotFound:
Unable to find css "#filter-button"
Run Code Online (Sandbox Code Playgroud)
如果我在测试中放置断点,我可以检查HTML并看到元素存在,并且我能够与它进行交互.
(byebug) page.has_css?('#filter-button', visible: false)
false
Run Code Online (Sandbox Code Playgroud)
以及
$('#filter-button')
Object { length: 1, context: HTMLDocument ? moves, selector: "#filter-button", 1 more… }
Run Code Online (Sandbox Code Playgroud)
我开始没有想法了.我唯一能想到的是,这个按钮位于一个容器内,在页面加载后通过javascript定位(只是通过增加顶部CSS值) - 但即便如此,我认为它仍然可以在页面然后显示:false/visible:all.