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) {});
});
