django app的多个实例,django支持这个

joh*_*les 5 python django django-models django-apps

我在django写了一个简单的反馈应用程序.它并不是特别复杂,基本上它允许经过身份验证的用户使用主题行编写一个镜头消息并通过表单提交该消息.然后,我允许选定组中的人查看用户提交的反馈.在未来,我可能会添加更多功能,但现在它可以实现我想要的功能.

这是我的问题,我正在建设的网站有多个地方,我想使用反馈应用程序,例如我有一个"你怎么看待这个网站?" 这种页的/dev/feedback/我也有一个在"/支持/反馈/"客户支持反馈目前我刚刚从我复制代码mysite.apps.dev.feedbackmysite.apps.support.feedback.

问题是,现在已经创建了相同代码的两个单独副本.尽管刚刚编写了应用程序,但两个版本已经开始出现分歧,这很烦人.我的问题是如何在具有不同数据库模型的django站点中创建同一应用程序的多个实例?

我发现相关但没有帮助的一些资源是https://docs.djangoproject.com/en/dev/topics/http/urls/Django中的反转命名空间URL:同一个应用程序多个实例第一页不提供关于这个问题,第二页提供了一些有点笨拙和不切实际的解决方案,这些解决方案看起来既无关紧要,也比工作更有价值.有没有一种正确的方法来实现相同的django应用程序的多个实例?

Yuj*_*ita 3

单一模型方法

我个人会尝试将其保留为一个应用程序,并拥有一个可以处理从多个位置发布/适当标记它们的视图。

正如 S.Lott 所说,这就是正确的出路。如果您对在其他情况下将代码保留在一个位置的方法感到好奇,我将提供替代方案。

例如,您可以category向模型添加一个字段,设置一个 url conf,它接受 URL 中的参数,例如,/(?P<category>\w+/feedback/$让视图简单地使用适当的类别标记反馈。

class MyForm(forms.ModelForm):
    class Meta:
        model = Feedback

def my_view(request, category):
    form = MyForm(request.POST or None)
    if request.method == 'POST':
        if form.is_valid():
            feedback = form.save(commit=False)
            feedback.category = category
            feedback.save()
            return http.HttpResponse("Thanks for posting!")
    return render(request, "mytemplate.html", {'form': form})

# urls.py
(r'^(?P<category>\w+)/feedback/$', 'my_view')

# user can visit dev/feedback or support/feedback and the feedback will be tagged appropriately
Run Code Online (Sandbox Code Playgroud)

抽象基类

另一个解决方案是构建一个抽象基类,然后为不同的表创建子类。这应该可以解决代码不同步的问题。

您将拥有一个抽象模型(没有表格),单独的应用程序中的“真实”模型将基于该模型。

动态生成的视图

如果您必须有单独的模型,您可能会编写动态构造的视图。

def view_generator(model_class):
    class MyForm(forms.ModelForm):
         class Meta:
              model = model_class

    def my_view(request):
        form = MyForm(request.POST or None)
        if request.method == 'POST':
            if form.is_valid():
                form.save()
                return http.HttpResponse("Thanks for posting!")
        return render(request, "mytemplate.html", {'form': form})
    return my_view


# urls.py
from foo import view_generator

(r'^my_first_feedback_form', view_generator(Model1))
(r'^my_second_feedback_form', view_generator(Model2l))
Run Code Online (Sandbox Code Playgroud)