Редактировать не обновляет базу данных - PullRequest
0 голосов
/ 21 мая 2019

Я пытаюсь редактировать некоторые данные, сохраненные в моей базе данных.

Итак, из readAllNew.html я вызываю кнопку редактирования:

<!DOCTYPE html>
<html>
<head>
    <title></title>
</head>
<body>
<table border="1">

        <tr>
        <th>Naslov</th>
        <th>Datum</th>
        <th>Autor</th>
        <th>Mail</th>
        </tr>
        {% for x in data %}
    <tr>
        <td>{{x.naslov}}</td>
        <td>{{x.datumObjave}}</td>
        <td>{{x.autor}}</td>
        <td>{{x.email}}</td>
        <td><a href="{% url 'delete' x.id %}">delete</a></td>
        <td><a href="{% url 'edit' x.id %}">edit</a></td>
    </tr>
    {% endfor %}
</table>
</body>
</html>

Оттуда этот URL вызывает (urls.py):

url(r'^app_1/(?P<id>[-\w]+)/edit/$',views.edit, name = 'edit'),

Мой views.py выглядит так:

def edit(request, id):
    data = get_object_or_404(Clanak, id = id)
    if request.method == "POST":
        form = ClanakForma(request.POST)
        if form.is_valid():
            data = form.save(commit=False)
            data.naslov = request.user
            data.datumObjave = request.user
            data.autor = request.user
            data.email = request.user
            return redirect('readAllNew.html')
    else:
        form = ClanakForma(instance=data)
        template = 'edit.html'
        context = {'form': form}
        return render(request, template, context)

My models.py

class Clanak(models.Model):
    naslov = models.CharField(null=False, blank=True, max_length=120)
    datumObjave = models.DateField(null=False, blank=False)
    autor = models.CharField(null=False, blank=True, max_length=50)
    email = models.EmailField(max_length=75, null=True, blank=True)

    def __str__(self):
        return str(self.naslov) + ', ' + str(self.datumObjave) + ', ' + str(self.autor)

Мои формы.py:

class ClanakForma(forms.ModelForm):
    class Meta:
        model = Clanak
        fields = '__all__'

И мой "edit.html":

<form method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>

Так что мой взгляд должен вызвать "edit.html", и это так. Я могу видеть поля со значениями внутри. Когда я что-то меняю и нажимаю «ОТПРАВИТЬ», меня перенаправляют на readAllNew.html, но база данных не обновляется.

----- ОБНОВЛЕНИЕ -----

Если добавить «data.save ()» и удалить строки:

    data.naslov = request.user
    data.datumObjave = request.user
    data.autor = request.user
    data.email = request.user

Он не редактирует ничего, но добавляет новую строку в таблицу. То же самое случится, если я оставлю это без data.save () и тех строк, но поменяю «Commit» на «False».

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вы создаете новый экземпляр модели, используя форму вместо редактирования существующей. Измените ваш взгляд на:

def edit(request, id):
    data = get_object_or_404(Clanak, id = id)
    form = ClanakForma(request.POST or None, instance=data)
    if request.method == "POST":
        if form.is_valid():
            form.save()
            return redirect('readAllNew.html')
    template = 'edit.html'
    context = {'form': form}
    return render(request, template, context)

Были также некоторые проблемы с вашим представлением, например, если форма недействительна, вы не будете возвращать ответ пользователю.

0 голосов
/ 21 мая 2019

добавить data.save () перед перенаправлением, как указано @Gasanov.Кроме того, поля вашей модели имеют отдельный тип данных, и вы пытаетесь обновить поля модели как request.user .Либо используйте решение, указанное @Gasanov, либо вы можете просто сохранить типы данных при назначении.

Вы обновили вопрос: при инициализации формы с использованием данных публикации используйте

form = ClanakForma(request.POST, instance=data)

См .: https://docs.djangoproject.com/en/2.2/topics/forms/modelforms/#the-save-method

...