【问题标题】:Edit - __init__() got an unexpected keyword argument 'instance'编辑 - __init__() 有一个意外的关键字参数“实例”
【发布时间】:2019-10-07 20:05:08
【问题描述】:

我正在尝试为我的表单创建“编辑”。

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”上的编辑链接时,我得到了错误:

TypeError at /app_1/5/edit/
init() 得到了一个意外的关键字参数“instance”

我认为我的观点有问题,但我不确定是什么。

-------------------更新--------------- ------------------

按照建议,我编辑了“forms.py”,但现在我没有看到任何表单字段,所以我什么也不能编辑:

See screenshot

---------------- 更新 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'

【问题讨论】:

  • 你能添加完整的readAllNew.html文件吗?
  • @JPG 我添加了完整的“readAllNew.html”文件

标签: django django-forms django-views


【解决方案1】:

您不能将 instance 传递给简单的形式 - 它必须是 ModelForm。使用这个:

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

【讨论】:

    【解决方案2】:

    使用forms.ModelForm 代替forms.Form

    class Forma(forms.ModelForm):
        naslov = forms.CharField(label='naslov')
        datumObjave = forms.DateField(label='datumObjave')
        autor = forms.CharField(label='autor')
        email = forms.EmailField(label='email')
    
        class Meta:
            model = Clanak
            fields = ('naslov', 'datumObjave', 'autor', 'email')

    如果你想在表单中使用Model类的所有字段,你可以指定fields属性>Meta 类为 fields = '__all__'

    #example
    class Forma(forms.ModelForm):
        class Meta:
            model = Clanak
            fields = '__all__'


    如果您使用 forms.ModelForm,则可以避免大部分实现,这会使事情变得更容易:)


    更新

    您需要在模板中呈现表单。因此,将您的模板更改为

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

    【讨论】:

    • 谢谢,它确实有效,但现在我有另一个问题,我不知道这两个是否已连接,所以您可以查看我上面的更新吗?
    • 您使用的是哪种类型的表格? ModelFormForm 类?
    • 现在我使用的是ModelForm,可能它没有正确读取数据,这就是为什么它是空白的?
    • 谢谢,你能检查一下我的“更新 2”吗?
    • 哦,兄弟......因为您得到了有关原始帖子的答案,并且更新的问题与当前上下文不同。所以,你应该问一个新问题?
    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 2018-04-26
    • 2017-07-01
    • 1970-01-01
    • 2019-01-05
    • 2021-10-29
    • 2014-09-14
    • 2016-08-25
    相关资源
    最近更新 更多