Редактирование формы в Django создает новый экземпляр - PullRequest
10 голосов
/ 27 июня 2011

Я редактирую форму, она загружает данные правильно, покупая, когда я нажимаю сохранить, она создает новую запись в базе данных.

Вот функции просмотра

def create_account(request):


    if request.method == 'POST': # If the form has been submitted...
        form = AccountForm(request.POST, request.FILES) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
                form.save()
                return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = AccountForm() # An unbound form

    return render_to_response('account_form.html', {
            'form': form,
    })

-

def edit_account(request, acc_id):

    f = Account.objects.get(pk=acc_id)
    if request.method == 'POST': # If the form has been submitted...
        form = AccountForm(request.POST, request.FILES) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
                form.save()
                return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = AccountForm(instance=f) # An unbound form

    return render_to_response('account_form.html', {
            'form': form,
    })

Мне действительно нужно иметь отдельную функцию редактирования и отдельную для удаления.Могу ли я сделать все в одной функции

шаблон

    <form action="/account/" method="post" enctype="multipart/form-data" >
    {% csrf_token %}
    {% for field in form %}
        <div class="fieldWrapper">
            {{ field.errors }}
            {{ field.label_tag }}: {{ field }}
        </div>
    {% endfor %}
    <p><input type="submit" value="Send message" /></p>
    </form>

Ответы [ 2 ]

14 голосов
/ 27 июня 2011

В разделе POST отсутствует аргумент instance.

Вместо этого:

form = AccountForm(request.POST, request.FILES) # A form bound to the POST data

Вы должны использовать это:

form = AccountForm(request.POST, request.FILES, instance=f) # A form bound to the POST data

Как только вы добавите это в форму добавления / редактирования, вы сможете добавлять / редактировать одновременно.

Будет добавлено, если instance=None, и обновлено, если instance является действительной учетной записью.

def edit_account(request, acc_id=None):
    if acc_id:
        f = Account.objects.get(pk=acc_id)
    else:
        f = None

    if request.method == 'POST': # If the form has been submitted...
        form = AccountForm(request.POST, request.FILES, instance=f) # A form bound to the POST data
        if form.is_valid(): # All validation rules pass
            form.save()
            return HttpResponseRedirect('/thanks/') # Redirect after POST
    else:
        form = AccountForm(instance=f) # An unbound form

    return render_to_response('account_form.html', {
        'form': form,
    })
1 голос
/ 27 июня 2011

Вы пробовали что-то подобное?

 # Create a form to edit an existing Object.
     a = Account.objects.get(pk=1)
     f = AccountForm(instance=a)
     f.save()

# Create a form to edit an existing Article, but use
# POST data to populate the form.
    a = Article.objects.get(pk=1)
    f = ArticleForm(request.POST, instance=a)
    f.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...