Django Rest Framework создать объект дополнительных данных - PullRequest
0 голосов
/ 26 июня 2018

Используя Django 2.0, у меня есть две модели post и group , в post есть ForeignKey , устанавливающая на группа . У меня есть подробное представление group в ' / group / name_of_group ', где я могу создать экземпляр post . Таким образом, в основном, когда мы создаем post , поле group должно быть автоматически установлено как group страницы (скажем, группа X, поэтому мы находимся в ' / group / X ') и мы отправляем данные по адресу: POST в / api / post / create Как это сделать? Вот мой код: Мои модели:

class Post(models.Model):
    user        = models.ForeignKey(settings.AUTH_USER_MODEL, default=1, on_delete=models.CASCADE)#the owner when we delete him, all his posts are deleted
    group       = models.ForeignKey(Group, default=1, on_delete=models.CASCADE)

class Group(models.Model):
    name        = models.CharField(max_length=50, default='', unique=True)

Моя форма:

class PostModelForm(forms.ModelForm):
     class Meta:
         model   = Post 
         fields  = [
              "content", 
              "group"
               ]

Мой API Просмотр для создания сообщения:

class PostCreateAPIView(generics.CreateAPIView): #/api/group/create
    serializer_class    = PostModelSerializer           
    permission_classes  = [permissions.IsAuthenticated]

вызов ajax при отправке формы

event.preventDefault();
$.ajax({
       method   : "POST",
       url      : '/api/post/create',
       data     : formData,//data contains our new post
       success  : function(data){
         this_.find("input[type=text], textarea").val("");//a display function for html
         attachPost(data, prepend = true);//a display function for html

       },
       error    : function(data){
         console.log("ERROR:CH0x2 while fetching after creation form submit");
         console.log("data :",data.status, data.statusText);
       }
     });

NB Например, для установки владельца сообщения мы переопределяем метод execute_create (в PostCreateAPIView) , чтобы установить пользователя как request.user нравится

def perform_create(self, serializer):               # create the post
    serializer.save(user = self.request.user)

но я не могу получить имя группы или pk в этом методе

/////// EDIT /////////

Я мог бы изменить свой URL для создания из: / апи / запись / создание в / апи / запись / name_group / создать

Спасибо

1 Ответ

0 голосов
/ 27 июня 2018

Я использовал JQuery для этого, Когда документ готов, я выбрал элемент и установил его значение, которое мне удалось передать в моем сериализаторе , и, наконец, я спрятал элемент следующим образом: (элемент является элементом HTML)

HTMl: (post-container - это место, где я собираюсь добавить свои сообщения

<p id="post-container" group-id     = "{{object.pk}}">

    </p>

Класс сериализатора:

class GroupModelSerializer(serializers.ModelSerializer):
class Meta:
    model  = Group   # the model to get fields from
    fields = [      
    'id',//this is the id I get and set on the choice field (<select>)
    'moderators',
    'name',
    'description',
    'timestamp'

    ]

JS:

$(document).on("ready",function(){ 
var selectGroup   = $('#create-post').find('select');//create-post is the id of the form html item where I put the django generated form
var postContainer = $('#post-container');
var labelGroup   = $('#create-post').find('label');
var groupId       = postContainer.attr("group-id");
selectGroup.val(groupId); selectGroup.prop('disabled',true); selectGroup.hide();labelGroup.hide()
initAjaxVariables('post-container', fetchDataUrl, postDataUrl); // init variables
initPostListDisplay(); //Fetch posts and display them
});

Спасибо всем!

...