0

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

假设我们在 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 表中?

谢谢。

4

1 回答 1

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.py,views.pyforms.py

class NamesForm(forms.ModelForm)
    class Meta:
        model = Names

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

将代码放入您的admin.pyorviews.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()

而已。我希望这可以帮助你。

于 2013-02-03T05:00:45.583 回答