«Невозможно принудительно выполнить обновление в save () без первичного ключа» - при отправке формы редактирования / обновления - PullRequest
0 голосов
/ 12 марта 2019

У меня есть форма редактирования, которую я хочу обновить только "заголовок", "контент" и "категория" сообщения.Для этого я включил update_fields при сохранении формы.Тем не менее, есть небольшая проблема с этим.Django вызывает ValueError (в частности, «Невозможно принудительно обновить обновление в save () без первичного ключа»), когда я отправляю форму.Почему это происходит, и как я могу это исправить?

Почтовая форма:

class PostForm(forms.ModelForm):

    def __init__(self,  *args, **kwargs):
        super().__init__(*args, **kwargs)
        for key in ['postTitle', 'postContent', 'category']:
            self.fields[key].widget.attrs.update({'class': 'form-control'})         
        self.fields['content'].widget.attrs.update(width='100px', height='50')

    class Meta:
        model = Post
        fields = ('title', 'content', 'category') 

Почтовая модель:

class Post(models.Model):
    title = models.CharField(max_length = 100)
    URL = models.SlugField() # slug for url 
    content = models.TextField()
    author = models.ForeignKey(User, on_delete = models.CASCADE, related_name = 'posts') # id of author
    category = models.CharField(max_length = 9, default = 'General') # category the post is in
    creationDate = models.DateTimeField()

Редактировать вид:

def editPost(request, pk):
    if request.method == 'GET':
        post = get_object_or_404(Post, pk = pk)
        if post.author == request.user:
            form = PostForm(instance = post)
            return render(request, 'editPost.html',  {'form': form, 'post': post})
        else:
            return redirect('viewPost', pk = pk, postURL = post.postURL)
    if request.method == 'POST':
        post = get_object_or_404(Post, pk = pk)
        form = PostForm(request.POST)
        if post.author == request.user:
            if form.is_valid():
                post = form.save(commit=False)
                post.URL = slugify(post.postTitle)
                post.save(update_fields = ['title', 'content', 'category', 'postURL'])
    return redirect('viewAll')

1 Ответ

1 голос
/ 12 марта 2019

Похоже, вы переназначаете пост здесь.В этой строке:

post = get_object_or_404(Post, pk = pk)

Вы получаете экземпляр Post из базы данных.Затем в этой строке:

post = form.save(commit=False)

Вы переназначаете переменную post для несохраненного экземпляра Post, заполненного только данными, доступными в request.POST.Затем, когда вы хотите сохранить это сообщение с аргументом update_fields , например:

post.save(update_fields = ['title', 'content', 'category', 'postURL'])

ValueError вызывается, потому что экземпляр Post, который вы пытаетесь сохранить, не имеет идентификатора, онимеет только то, что доступно в запросе. POST

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...