IntegrityError at /api/post/ null value in column "login" violates not-null constraint DETAIL:

подскажите пожалуйста как при создании поста добавлять login

models.py

class Post(models.Model):
    login = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, db_column='login', verbose_name='Логин') #FIXME убрать blank и null после добавления логина
    message = models.CharField(max_length=240, verbose_name='Сообщение', blank=True)
    created_date = models.DateTimeField('Дата публикации', auto_now_add=True, name='createdDate')
    background_color = models.CharField(max_length=200, verbose_name='Цвет фона', blank=True, name='backgroundColor')
    tags = models.ManyToManyField('Tag', blank=True, null=True)

serializers.py

class PostListSerializer(serializers.ModelSerializer):
    links = PostLinkSerializer(many=True)
    tags = TagSerializer(many=True)
    login = serializers.CharField(source='login.login')
    createdDate = serializers.DateTimeField(format="%d %b %H:%M", default=True)

    class Meta:
        model = Post
        fields = '__all__'

    def create(self, validated_data):
        links_data = validated_data.pop('links')
        tags_data = validated_data.pop('tags')
        login_data = validated_data.pop('login')
        post = Post.objects.create(**validated_data)
        for links in links_data:
            post.links.create(**links)
            for tags in tags_data:
                post.tags.create(**tags)
                for login in login_data:
                    post.login.create(**login)
        return post

views.py

class PostView(APIView):
    queryset = Post.objects.all()
    serializer_class = PostListSerializer

    def get(self, request, format=None):
        posts = Post.objects.all()
        serializer = PostListSerializer(posts, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = PostListSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

ошибка введите сюда описание изображения


Ответы (1 шт):

Автор решения: Za Ars

Добавьте форму

# forms.py
class PostModelForm(forms.ModelForm):
    class Meta:
        model = Post
        fields = '__all__'

И выведите ее в фронтэнд части

# views.py

def get_context_data(self, **kwargs):
    ctx = super().get_context_data(**kwargs)
    ctx['form'] = PostModelForm()
    return ctx

# *.html

<form method="post" action="">
{% csrf_token %}
{{ form }}
<button>Click</button>
</form>

На кнопку вешаете обработчик JS который отправляет запрос по вашему API, передавая login как pk, но в форме отображается как select где у option значение = pk а текстовое представление - то что в __str__()


Если не через форму Django, то рисуете форму вручную, задаете для поля login данные для выборки (получаете по API который возвращает данные для формы или список юзеров). И при заполнении отправляете AJAX POST запрос с данными из формы.

let form;
form.submit(function(e) {
    $.ajax({url: url, data: form.serialize, success: function(data) {}); 
});
→ Ссылка