2016-12-15 6 views
3

Я хотел бы сделать следующее:Рендер Форма Viewset Джанго Rest Framework

С моей модели

class User(models.Model): 
    id = models.AutoField(primary_key=True) 
    field1 = models.CharField(max_length=100) 
    fk1 = models.ForeignKey(Group) 
goes on 

После этого я создал мой Serializer, который выглядит как:

class UserSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = UserSerializer 
     fields = (...) 

    ... 

Наконец, я создаю свой ViewSet, который должен выглядеть так:

class UserViewSet(viewsets.ModelViewSet): 
    queryset = User.objects.all() 
    serializer_class = UserSerializer 

но теперь, как я могу создать viewSet и, например, сгенерировать форму с моим классом? Моя последняя идея - сделать что-то вроде:

def my_view(request): 
    my_form = UserViewSet.as_view({'get': 'list'}(request)) 
    # from here either to be able to use .render().content 
    # or, inside the template, render with {% render_form my_form %} 

Возможно ли это? Спасибо

ответ

1

Что вы предлагаете, возможно, но это обычно не имеет смысла. Django Rest Framework отлично подходит для создания API, чтобы вы могли отправлять и получать информацию с этого api, возможно, в формате JSON.

Получение формы предполагает получение HTML-кода с сервера. Это самая лучшая задача для самого Django. Вы можете использовать CreateView делать то, что вы пытаетесь:

def UserCreateView(CreateView): 
    model = User 
    form_class = "name_of_your_form.html" # Or you could call the form 'user_create_form.html` and leave this line out. 
    fields = [...] 

Ваша форма будет доступна в шаблоне, согласно документации:

<form action="" method="post">{% csrf_token %} 
    {{ form.as_p }} 
    <input type="submit" value="Save" /> 
</form> 
+0

Можете ли вы предложить мне лучший способ сделать это ? Я открыт для хороших практик. Я только начинаю это изучать. Мне нужно сохранить сериализаторы, хотя – Bobleujr

1

Как Docs говорит:

Сериализаторы могут быть представлены в виде форм с использованием тега шаблона render_form и включают экземпляр serializer в качестве контекста для шаблона.

Следующий пример, вероятно, сработает для вас. Но как @YPCrumble Сайед цель ФПИ легко и быстро построить API, не оказывающего формы

class UserDetail(APIView): 
    renderer_classes = [TemplateHTMLRenderer] 
    template_name = 'your_template.html' 

    def get(self, request, pk): 
     serializer = UserSerializer(profile) 
     return Response({'serializer': serializer}) 

    def post(self, request, pk): 
     user = get_object_or_404(User, pk=pk) 
     serializer = UserSerializer(data=request.data) 
     if not serializer.is_valid(): 
      return Response({'serializer': serializer}) 
     serializer.save() 
     return redirect('some_url_name') 

файл шаблона:

{% load rest_framework %} 
<html><body> 

    <form action="{% url 'user_url' pk=user.pk %}" method="POST"> 
     {% csrf_token %} 
     {% render_form serializer %} 
     <input type="submit" value="Save"> 
    </form> 

</body></html> 

`DRF Docs link