Anget
Anget

Reputation: 61

How to get or update in a form?

What I am trying to do : I am trying to update the LogDone object in my view when the form is save.

The logdone was already created before, I want to use the id of the logdone previously created and update instead of creating a new one.

def create_logdone(request, logmessage_id, log_id, token ):
    log = get_object_or_404(LogBook, pk=log_id)
    logmessages = get_object_or_404(LogMessage, pk=logmessage_id, logbook=log)
    logdone = LogDone.objects.update_or_create(logmessage=logmessages)
    form = CreateLogDone(request.POST)
    if request.method == "POST":
        if form.is_valid():
            instance = form.save(commit=False)
            instance.done_by = request.user
            instance.logmessage = logdone
            instance.save()

Error I get

"LogDone.logmessage" must be a "LogMessage" instance.

Upvotes: 1

Views: 60

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477794

You pass it as instance to the CreateLogDone form:

def create_logdone(request, logmessage_id, log_id, token ):
    log = get_object_or_404(LogBook, pk=log_id)
    logmessage = get_object_or_404(LogMessage, pk=logmessage_id, logbook=log)
    logdone, __ = LogDone.objects.update_or_create(logmessage=logmessage)
    form = CreateLogDone(request.POST, instance=logdone)
    if request.method == "POST":
        if form.is_valid():
            form.instance.done_by = request.user
            form.save()
            # …
    # …

Note: Usually a Form or a ModelForm ends with a …Form suffix, to avoid collisions with the name of the model, and to make it clear that we are working with a form. Therefore it might be better to use CreateLogDoneForm instead of CreateLogDone.

Upvotes: 1

Related Questions