使用变量

时间:2018-01-27 22:58:07

标签: django django-models django-forms django-views

当用户在我的网站上注册时,他们会选择他们希望将其视为用户个人资料的一部分的模板。在这种情况下,因为他们想要看到绿色' profile,user.userprofile.color等于1.

我为绿色模板以及该模型的特定表单(称为form1)构建了一个特定模型(称为model1)。当用户选择“绿色”时在UserProfile表单中并提交表单,model1的实例将自动分配给用户

在views.py中,我想创建一个通用视图,它接受user.userprofile.color值并使用它来建立

a)以何种形式提供网页

b)表格基于什么模型

而不是像这样硬编码表单和模型值:

def homepagetemplate(request):

if request.method == 'POST':
    form = form1(request.POST, request.FILES, 
    instance=request.user.model1)

    if form.is_valid():
        form.save()
        return redirect('/accounts/')        


else:
    form = form1(instance=request.user.model1)
    args = {'form': form}
    return render(request, 'homepage.html', args)

在功能中而不是指定' form1'和' model1',我希望表单和模型值等于'形式' + i和' model' + i其中i等于值user.userprofile.color(即1)。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找Django's contenttypes framework

基本上你可以创建一个包含以下内容的模型:

from django.db import models
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class Templates(models.Model):
    template_name = models.SlugField()  # e.g. "green"
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)  # this will point to a template model
    object_id = models.PositiveIntegerField()  # this one will point to a specific row in your DB - resulting with an model instance
    content_object = GenericForeignKey('content_type', 'object_id')

您的用户模型可以template = models.ForeignKey(Templates)引用此模型,以便您可以执行此操作:

template = User.objects.get(pk=1).template.content_object

现在对于表单部分......这将更加棘手。也许Templates模型可以存储导入路径,然后使用import_modeule How to access a python module variable using a string [ django ]加载该特定表单?

感觉可能有更适合您的用户需求的解决方案。即使模型最终成为一个属性包并且对于前者具有动态形式Jacob Kaplan-Moss one of Django's core contributors explain how to achieve the latter,我也找不到任何快速的东西(对于这一个问题,这将是太难了)。