繁体   English   中英

django应用程序的多个实例,django是否支持此功能

[英]Multiple Instances of a django app, does django support this

我已经在Django中编写了一个简单的反馈应用程序。 它并不是特别复杂,基本上,它允许经过身份验证的用户编写带有主题行的快照消息,并通过表单提交该消息。 然后,我允许选定组中的谁查看用户提交的反馈。 将来我可能会添加更多功能,但是现在它可以满足我的要求。

我的问题来了,我正在建设的网站有多个我想使用反馈应用程序的地方,例如,我有一个“您如何看待该网站?” /dev/feedback/此类页面。“ / support / feedback /”上也有一个客户支持反馈的页面。目前,我刚刚将代码从mysite.apps.dev.feedback复制到mysite.apps.support.feedback

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

我发现一些相关但无用的资源是https://docs.djangoproject.com/en/dev/topics/http/urls/Django中反向命名空间的URL:同一应用程序多个实例第一页没有提供在此问题上有很多内容,第二页提供了一些笨拙和不切实际的解决方案,这些解决方案似乎既无关紧要,又比其价值更大。 有没有适当的方法来实现同一Django应用程序的多个实例?

单模型方法

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

正如S.Lott所说,这是要走的路 如果您对将代码保持在其他情况下的某个位置的方法感到好奇,我会提供其他选择。

例如,您可以在模型中添加一个category字段,设置一个URL conf,该URL接受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

抽象基类

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

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

动态生成的视图

如果必须具有单独的模型,则可以编写动态构造的视图。

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))

如何在具有不同数据库模型的Django站点中创建同一应用程序的多个实例?

你不应该

您只需在from feedback.models import Feedback一个from feedback.models import Feedback ,即可在其他两个app中简单使用feedback app模型。

然后,您的support应用程序可以创建,检索,更新和删除反馈对象。

同样,您的dev应用程序可以导入模型,因此可以创建,检索,更新和删除“反馈”对象。

这就是所有需要的内容: import

感谢Yuji Tomita的非常彻底的回答,我的最终解决方案非常接近他的建议,但又有很大的不同,以至于我认为如果其他人遇到与我相同的情况,我会将其发布为另一种选择。

首先,在我的mysite.apps.feedback.models文件中

class Feedback( models.Model ):
   subject = models.TextField( max_length=100 )
   body = models.TextField( max_length=100 )
   # Some other stuff here...
   # Finally I used the suggestion above and created a field which I 
   # use to label each entry as belonging to a specific instance of the app.
   instance_name = models.TextField( max_length=20 )

在我的mysite.apps.feedback.views文件中

def save_message( request, instance_name ):
    if request.method == 'POST':
        form = FeedbackFrom( request.POST )
        if form.is_valid():
            form.instance.instance_name = instance_name
            form.save()
            return render("feedback/thanks.html")
         else:
             return render("feedback/submit.html", {'form':form })
     else:
         return render("feedback/submit.html",{'form':FeedbackForm()})

@user_passes_test( is_staff )
def all_messages( request, instance_name ):
    messages = Feedback.objects.filter( instance_name = instance_name )
    return render("feedback/view_all.html",{'feedback':messages} )

在我的mysite.apps.dev.urls文件中

url(r'^feedback/', include('mysite.apps.feedback.urls'),
    {'instance_name':'dev'}),

在我的mysite.apps.support.urls文件中

url(r'^feedback/', include('mysite.apps.feedback.urls'),
    {'instance_name':'support'}),

这将按应用程序实例分隔反馈消息。 请注意,我的实际代码更加复杂,但这对于遇到类似问题的任何人来说都足够好,可以迅速启动解决方案并开始运行。 希望这对处于类似情况的任何人都有用。 再次感谢Yuji Tomita提供此解决方案所依据的建议。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM