python-3.x - 如何预填充并保存 Django 模型记录而不覆盖当前记录?

标签 python-3.x django-models

我有一个表单,我想用用户之前的输入来预先填写。我使用 Form(instance = object) 代码来做到这一点。但是,在用户提交表单后,先前的表单条目将被新的表单条目更新。我不希望这样,相反,我希望它创建一个不同的实例,以便跟踪更改历史记录。有什么办法可以做到这一点,同时仍然能够预先填写表格吗?

查看.py

from django.shortcuts import render, redirect
from .models import Topic, Entry
from .forms import TopicForm, EntryForm

def edit_entry(request, entry_id):
    entry = Entry.objects.get(id = entry_id)
    topic = entry.topic

    if request.method != 'POST':
        # Initial request; pre-fill for with the current entry.
        form = EntryForm(instance = entry)

    else:
        # POST data submitted.
        form = EntryForm(instance = entry, data = request.POST)
        if form.is_valid():
            form.save()
            return redirect('learning_logs:topic', topic_id = topic.id)

    context = {'entry': entry, 'topic': topic, 'form': form}
    return render(request, 'learning_logs/edit_entry.html', context)

表单.py

from django import forms
from .models import Topic, Entry

class TopicForm(forms.ModelForm):
    class Meta:
        model = Topic
        fields = ['text']
        labels = {'text':''}

class EntryForm(forms.ModelForm):
    class Meta:
        model = Entry
        fields = ['text']
        labels = {'text':''}
        widgets = {'text': forms.Textarea(attrs = {'cols': 80, 'spellcheck':True})}

模型.py

from django.db import models
from django.contrib.auth.models import User

class Topic(models.Model):  
    text = models.CharField(max_length = 200)
    date_added = models.DateTimeField(auto_now_add = True)
    owner = models.ForeignKey(User, on_delete = models.CASCADE)

class Entry(models.Model):
    topic = models.ForeignKey(Topic, on_delete = models.CASCADE)
    text = models.TextField()
    date_added = models.DateTimeField(auto_now_add = True)

最佳答案

您可以将条目的主键.pk设置为None,这样它将创建一条新记录:

from django.shortcuts import render, redirect
from .models import Topic, Entry
from .forms import TopicForm, EntryForm

def edit_entry(request, entry_id):
    entry = Entry.objects.get(id = entry_id)
    topic = entry.topic

    if request.method != 'POST':
        # Initial request; pre-fill for with the current entry.
        form = EntryForm(instance=entry)

    else:
        # POST data submitted.
        <b>entry.pk = None</b>  # ← set .pk entry to None
        form = EntryForm(request.POST, instance=entry)
        if form.is_valid():
            form.save()
            return redirect('learning_logs:topic', topic_id = topic.id)

    context = {'entry': entry, 'topic': topic, 'form': form}
    return render(request, 'learning_logs/edit_entry.html', context)

关于python-3.x - 如何预填充并保存 Django 模型记录而不覆盖当前记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64600322/

相关文章:

python - 防止为特定的 save() 调用发送信号

python - 如何在 Django 中使用模型进行查询

python - 为什么 `object.__init__` 不带参数

python3.8-venv 不适用于 python3.8 -m venv env

python - 将数据描述符传递给函数

django - 如何在 Django 中打印单个对象的所有值?

python - 如何在django中通过实例获取所有对象

具有现有数据库的 Django 模型

python - 将多个网页抓取到单个 csv 中

numpy - Dtype 在 FROM 但不是 IMPORT 中工作