如何从表单django admin编辑数据

时间:2013-02-02 17:42:31

标签: django django-forms django-admin

我正在学习Django Framework,我有一个问题。为了帮助您理解,我将尝试使用以下示例进行解释:

假设我们在db中有一些表:

CREATE TABLE names (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(100));

我的格式是 Django Admin

<form>
    <textarea name="names"></textarea>
    <input type="submit" name="sbt" value="Submit">
</form>

用户在表单的输入names中输入了内容并提交了。然后,脚本捕获此数据并将其拆分为数组(str.split("\n"))并循环添加到表名称!

我很多地说:

  1. 如何将表单添加到Django Admin?
  2. 我如何捕获表单数据并将此数据添加到数据库中的somethink表?
  3. 感谢。

1 个答案:

答案 0 :(得分:0)

首先,你必须创建一个django模型。

将此代码放入models.py

class Names(models.Model):
    name = models.CharField(max_length = 100)

然后你必须创建管理模型。

将此代码放入admin.py

class NamesAdmin(admin.ModelAdmin):
    list_display = ['name']
    # whatever you want in your admin panel like filter, search and ...

admin.site.register(Names, NamesAdmin)

我认为它符合您的要求。对于拆分名称,您可以覆盖保存模型方法并在其中拆分名称。但是如果你想要一个额外的表格,你可以轻松创建一个django模型表格。

将代码放在admin.pyviews.pyforms.py

之类的地方
class NamesForm(forms.ModelForm)
    class Meta:
        model = Names

这是你的模特和形式。因此,如果您想将表单添加到django管理面板,则必须在django admin中为其创建一个视图。为此,请创建一个常见的视图。

将代码放入admin.pyviews.py

def spliter(req):
    if req.method == 'POST':
        form = NamesForm(req.POST)
        if form.is_valid():
            for name in form.cleaned_data['names'].split(' '):
                Names(name = name).save()
                return HttpResponseRedirect('') # wherever you want to redirect
        return render(req, 'names.html', {'form': form})
    return render(req, 'names.html', {'form': NamesForm()})

请注意,您必须创建names.html并将以下代码放入html页面。

{% extends 'admin/base_site.html' %}

{% block content %}
    <!-- /admin/names/spliter/ is your url in admin panel (you can change it whatever you want) -->
    <form action="/admin/names/spliter/" method="post" >{% csrf_token %}
        {{ form }}
        <input type="submit" value="'Send'" >
    </form>
{% endblock %}

这是您的观点,您可以随处使用它。但是,如果您只想让管理员有权查看此页面,则必须在NamesAdmin课程中添加此方法。

def get_urls(self):
    return patterns(
        '',
        (r'^spliter/$', self.admin_site.admin_view(spliter)) # spliter is your view
    ) + super(NamesAdmin, self).get_urls()

就是这样。我希望这可以帮到你。