Django:使用视图来处理表单的标准方法是什么?

Django: What's the standard way to use a view just to process a form?

一个用户正在 profile/userB/ 查看另一个用户的个人资料,然后单击“添加朋友”按钮。

这会将包含两个用户的 POST 表单提交到 friends 应用程序 (friends/create/) 中的 create 视图,该应用程序处理数据,创建一个新的 Friend 对象并将其保存在数据库中。一条即时消息被设置为反馈,用户发现自己在 profile/userB/.

重新打开

用户从未见过 friend/create/

这感觉很明显,我经常用 CakePHP 这样做,但我在 Django 中很难想象。我试图将 forms.py 分开,模板周围的表单也分开(例如 'Add Friend' 模板可能包含在不同的位置,包括上面的表单和提交)。我认为这是正确的方法吗?

谢谢

听起来您甚至不需要表格,也不需要提交 POST。不要将 url 定义为 friend/create/,而是使用如下内容:

url(r'^create-friendship/(?P<user_id>\d+)/$', 'create_friendship', name='create-friendship'),

然后你把你的Add Friend定义为一个link(但是为了用户体验你应该把它做成一个按钮),大致是这样的:

<a href="{% url 'app:create-friendship' userB.id %}?from={{ request.path|urlencode }}">Add friend</a>

请注意,我在 link 的末尾添加了一个 GET 参数 from,这是您传递给视图方法的当前 url。然后在您的创建视图中:

def create_friendship(user_id):
    # logic to build your friendship relationship between user_id and request.user
    if request.GET.get('from'):
        return HttpResponseRedirect(request.GET.get('from'))
    else:
        # return to some other urls

在 django 中没有 "built-in" 方法可以做到这一点,但是一旦你更好地理解了框架,它就会变得显而易见。

ps:为了访问 django 模板中的 request 变量,您必须启用模板处理器,将以下内容添加到设置中的 TEMPLATE_CONTEXT_PROCESSOR:

TEMPLATE_CONTEXT_PROCESSORS = (
  # ...
  'django.core.context_processors.request',
  # ...
)