Изменить - __init __ () получил неожиданный аргумент ключевого слова 'instance' - PullRequest
2 голосов
/ 21 мая 2019

Я пытаюсь создать «Изменить» для своей формы.

urls.py

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

forms.py

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

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)

views.py

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

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>

Поэтому, когда я нажимаю ссылку редактирования на моем "readAllNew.html", я получаю ошибку:

Ошибка типа в / app_1 / 5 / edit / init () получил неожиданный аргумент ключевого слова 'instance'

Я думаю, что-то не так с моим мнением, но я не уверен, что.

-------------------------------ОБНОВИТЬ--------------------------------

Как и предполагалось, я отредактировал файл "forms.py", но теперь я не вижу поля формы, поэтому не могу ничего редактировать:

Смотрите скриншот

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

Я создал новый HTML-файл как «edit.html»

Я отредактировал «views.py»:

def edit(request, id):
    data = get_object_or_404(Clanak, id = id)
    if request.method == "POST":
        form = ClanakForma(instance=data)
        if form.is_vaild():
            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)

Теперь я вижу поляи информация в нем правильно, но когда я что-то меняю и нажимаю «ОТПРАВИТЬ», я получаю сообщение об ошибке:

AttributeError at /app_1/6/edit/
'ClanakForma' object has no attribute 'is_vaild'

Ответы [ 2 ]

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

Используйте forms.ModelForm вместо forms.Form

class Forma(<b>forms.ModelForm</b>):
    naslov = forms.CharField(label='naslov')
    datumObjave = forms.DateField(label='datumObjave')
    autor = forms.CharField(label='autor')
    email = forms.EmailField(label='email')

    <b>class Meta:
        model = Clanak
        fields = ('naslov', 'datumObjave', 'autor', 'email')</b>

Если вы хотите использовать все поля класса модели в своей форме, вы можете указать атрибут fields Meta класс как fields = '__all__'

<Code>#example
class Forma(forms.ModelForm):
    class Meta:
        model = Clanak
        fields = '__all__'</code>


Если вы используете forms.ModelForm, вы можете избежать большинства реализаций, что облегчает задачу:)


Обновление

Вам необходимо отобразить форму в шаблоне. Измените шаблон на

<form method="post">
    {% csrf_token %}
    {{ form }}
    <input type="submit" value="Submit">
</form>
0 голосов
/ 21 мая 2019

Вы не можете передать instance в простую форму - это должно быть ModelForm.Используйте это:

class Forma(forms.ModelForm):
    class Meta:
        model = Clanak
        fields = ['naslov', 'datumObjave', 'autor', 'email']
        labels = {
            'naslov': 'naslov',
            'datumObjave': 'datumObjave',
            'autor': 'autor',
            'email': 'email'
        }
...