在表单中添加新的ManyToMany关系?

问题描述 投票:0回答:1

Django新手在这里。我一直在遇到完全相同的设计范例,这似乎对每个人来说都应该是常见的,但却无法找出它应该如何解决。

想象以下ManyToMany关系:

  • 一个组织可以有很多成员;每个人都可以成为许多组织的成员
  • 组织可以管理许多对象。一个对象可能被多个组织使用。这同样适用于人与物之间的关系。
  • 组织,个人或对象可以具有多个媒体元素(照片,视频等),并且单个媒体元素可以被许多组织,人或对象标记。

没什么不寻常的。但网站用户如何添加新的人员,组织或对象?似乎有人填写“添加组织”表格,除了从现有人,对象,媒体等中选择外,还应该有“新成员”,“新对象”,“新照片”的按钮,等等,这应该带你到创建新成员,对象,媒体等的表格。当它们完成后,它应该回到上一页 - 其表格填写表格条目应该保留,并且新的创建的条目应列在其各自的ManyToMany字段中。

问题是,我不知道该怎么做。我不知道如何在表单中间添加一个按钮,似乎找不到任何东西来澄清如何做到这一点。我假设它需要是一个提交按钮,具有不同的名称/ ID或其他方式,以便views.py可以通过标记数据库中的“不完整”记录来区别对待它。并且新表单需要传递有关在提交时需要返回的页面的信息。

我正确地考虑了这个吗?如果是这样,那么我认为我缺乏的唯一知识是如何在表单中添加第二个提交按钮以及如何在views.py中识别它的用法。

但是,如果我没有正确地思考这个问题,请提出一个您认为更有意义的替代范例:)这是我的第一个Django项目,所以我正在学习这样做。

ED:我想也许不是使用{{form.as_p}}来显示它,我需要迭代字段并使用一些逻辑在中间添加额外的提交按钮为html:What's the best way to add custom HTML in the middle of a form with many fields?

然后我只需要找出一种方法来检测使用哪个提交按钮并在其后面加上一些逻辑来处理部分提交的表单,重定向到表单以创建关系,然后重定向回提交...我可能会想出来......

django
1个回答
0
投票

我建议的第一件事是定义你的模型。使用您需要的属性将它们全部展开。这将是你想要完成的其他事情的基础。你可以用Django做你提到的所有事情......这只是编码的问题。据我所知,您需要单独创建每个模型实例,然后您可以在组织模型的创建表单中引用已创建的实例。我会查看有助于您轻松创建对象的通用视图的文档。然后,如果您愿意,您可以链接到其他创建表单。我不知道如何在一个表单中创建不同模型的多个实例,我认为即使可以,这也不是最好的方法。以下是模型,创建表单,创建视图和相应URL的示例:

# models.py
class Organization(models.Model):
    name = models.CharField(max_length=100, null=True, blank=True)

# forms.py
class OrganizationForm(forms.ModelForm):
    class Meta:
        model = Organization
        fields = ('name',)

    def __init__(self, *args, **kwargs):
        super(OrganizationForm, self).__init__(*args, **kwargs)
        self.fields['name'].required  = True

    def clean(self):
        cleaned_data = super(OrganizationForm, self).clean()
        name = cleaned_data.get('name')

# views.py
class OrganizationCreateView(CreateView): # inherits from CreateView
    form_class = OrganizationForm
    template_name = 'create_org.html'
    success_url = 'success'

    def form_valid(self, form): # validate the form and save the model instance
        org = form.save(commit=False)
        org.save()
        return redirect(reverse('redirect_url'))

# urls.py
from Project.apps.app_name import views as app_views

app_name = 'app_name'

urlpatterns = [
           url(r'^create_org/$', app_views.OrganizationCreateView.as_view(), name='create_org'), # as_view() is used for class based views

# create_org.html

<form method="post">

 {% crsf_token %}
 {{ form.as_p }}
 <a href="{% url 'app_name:create_person' %}>Create person</a> # You can link to other create views, and just style the link as a button.
 <input type="submit" value="Submit">

</form>

希望有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.