【问题标题】:Handling one to one relationship between django models处理 django 模型之间的一对一关系
【发布时间】:2019-06-14 18:51:30
【问题描述】:

我在 2 个模型之间建立了一对一的关系。在创建第二个模型时,我想将第一个模型的实例传递给第二个。

这 2 个模型是我们 Web 应用程序中的新选项卡/功能。我尝试通过 URL 传递实例,但没有成功。也许我没有正确遵循步骤。

详情:

python 版本:Python 3.6.4 :: Anaconda, Inc.

django 版本:2.0.2-3

请在下面找到代码:

1) 模型.py

class StudyConcept(models.Model):
    requestor_name = models.CharField(max_length=240, blank=False, null=False)
    project = models.CharField(max_length=240, blank=False, null=False)
    date_of_request = models.DateField(blank=False, null=False)
    brief_summary = models.CharField(max_length=4000, blank=False, null=False)

    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.id)

class Logistics(models.Model):
    budget = models.CharField(max_length=255, blank=False, null=False)
    business_technology = models.CharField(max_length=3, choices=CHOICES, blank=False, null=False)
    vendor_or_contracts = models.CharField(max_length=3, choices=CHOICES, blank=False, null=False)

    studyConcept = models.OneToOneField(StudyConcept, on_delete = models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)

    def __str__(self):
        return str(self.id)

    def get_absolute_url(self):
    return reverse('update_Logistics', kwargs={'pk': self.pk})


    def get_deliverablesLogistics(self):
        return ','.join([str(i) for i in self.deliverablesLogistics.all().values_list('id', flat=True)])

    def get_paymentScheduleLogistics(self):
        return ','.join([str(i) for i in self.paymentScheduleLogistics.all().values_list('id', flat=True)])

    def get_commentsLogistics(self):
        return ','.join([str(i) for i in self.commentsLogistics.all().values_list('id', flat=True)])


class DeliverablesLogistics(models.Model):
    milestone_deliverable = models.CharField('MileStone/Deliverable', max_length=480, blank=False, null=False)
    poa = models.CharField('POA', max_length=480, blank=False, null=False)
    start_date = models.DateField(blank=False, null=False)
    end_date = models.DateField(blank=False, null=False)
    logistics = models.ForeignKey(Logistics, related_name='deliverablesLogistics', on_delete=models.CASCADE)

    def __str__(self):
        return str(self.id)


class PaymentScheduleLogistics(models.Model):
    milestone_deliverable = models.CharField('MileStone/Deliverable', max_length=480, blank=False, null=False)
    cost = models.DecimalField(max_digits=14, decimal_places=2, blank=False, null=False, default=0)
    estimated_payment_date = models.DateField(blank=False, null=False)
    logistics = models.ForeignKey(Logistics, related_name='paymentScheduleLogistics', on_delete=models.CASCADE)

    def __str__(self):
        return str(self.id)
class CommentsLogistics(models.Model):
    comments = models.CharField('Comment', max_length=2000, blank=True, null=True)
    commented_by = models.CharField(max_length=2000, blank=True, null=True)
    logistics = models.ForeignKey(Logistics, related_name='commentsLogistics', on_delete=models.CASCADE)

    def __str__(self):
        return str(self.id)
  1. views.py
def load_concepts(request):
    currentUser = User.objects.get(id=request.user.id)
    concepts = StudyConcept.objects.all().filter(user=request.user)
    #concepts = get_object_or_404(StudyConcept)
    return render(request, 'concept_dropdown_list_options.html',{
        'concepts':concepts
    })

class LogisticsFormsetCreate(CreateView):
    model = Logistics
    template_name = 'createLogistics.html'
    form_class = LogisticsForm
    success_url = reverse_lazy('create_Logistics')

    def get_context_data(self, **kwargs):
        data = super(LogisticsFormsetCreate, self).get_context_data(**kwargs)
        if self.request.POST:
            data['deliverable'] = DeliverablesLogisticsFormset(self.request.POST, prefix='deliverables')
            data['paymentSchedule'] = PaymentScheduleLogisticsFormset(self.request.POST, prefix='payments')
            data['comment'] = CommentsLogisticsFormset(self.request.POST, prefix='comments')
            #data['studyRequestConcept'] = self.request.POST.get('studyRequestConcept')

        else:
            data['deliverable'] = DeliverablesLogisticsFormset(prefix='deliverables')
            data['paymentSchedule'] = PaymentScheduleLogisticsFormset(prefix='payments')
            data['comment'] = CommentsLogisticsFormset(prefix='comments')
            #data['studyRequestConcept'] = self.request.GET.get('studyRequestConcept')
        return data

    def form_valid(self, form):
        context = self.get_context_data()
        deliverable = context['deliverable'] 
        paymentSchedule = context['paymentSchedule']
        comment = context['comment']
        with transaction.atomic():
            if deliverable.is_valid() and paymentSchedule.is_valid() and comment.is_valid():
                self.object = form.save(commit=False)
                self.object.user = self.request.user
                self.object = form.save()
                deliverable.instance = self.object
                deliverable.save()
                paymentSchedule.instance = self.object
                paymentSchedule.save()
                comment.instance = self.object
                comment.save()
                messages.success(self.request, Logistics.__name__ +' Form ID: '+ str(self.object.id) + ' was submitted successfully')
                return super(LogisticsFormsetCreate, self).form_valid(form)
            else:
                return self.render_to_response(self.get_context_data(form=form))
  1. 模板
{% extends "header.html" %}
{% load widget_tweaks %}
{% block content %}
{% csrf_token %}

{% include 'xdsoft_stylesheets.html' %}

{% include 'messages.html' %}
<div class="container" align="center">
    <h1 class="display-5">Logistics</h1>
</div>
<br/>

<div class="table-responsive">
    <table class="table table-striped table-bordered" id="example" data-toggle="table"
    data-filter-control="true" data-show-export="true"
    data-click-to-select="true" data-toolbar="#toolbar" data-escape>
        <thead>
            <tr>
                <th></th>
                <th class="text-center" data-field="id" data-filter-control="input">ID</th>
                <th class="text-center" data-field="project" data-filter-control="input">Project</th>
                <th class="text-center" data-field="date_of_request" data-filter-control="input">Date</th>
                <th class="text-center" data-field="brief_summary" data-filter-control="input">Summary</th>
                <th class="text-center" data-field="scientific_question" data-filter-control="input">Question</th>
            </tr>
        </thead>
        <tbody>
            {%for studyRequestConcept in concepts %}
            <tr>
                <td style="width:200px">
                    <a class=" btn btn-primary js-create-logistics" data-toggle="modal" data-target="#modal" href="{% url 'create_Logistics' %}">
                        <span class="glyphicon glyphicon-plus"></span>
                        New Logistics
                    </a>
                </td>
                <td class="text-left">{{studyRequestConcept.id}}</td>
                <td class="text-left">{{studyRequestConcept.project}}</td>
                <td class="text-left">{{studyRequestConcept.date_of_request}}</td>
                <td class="text-left">{{studyRequestConcept.brief_summary}}</td>
                <td class="text-left">{{studyRequestConcept.scientific_question}}</td>
            </tr>
            {% endfor%}
        </tbody>
    </table>
</div>

{% comment %}The modal container{% endcomment %}
<div class="modal" id="modal" data-backdrop="false"></div>

<script>
    $(function () {
        $('.js-create-logistics').click( function () {
            var btn = $(this)
            $.ajax({
                url: btn.attr("href"),
                context: document.body
            }).done(function(response) {
                $("#modal").html(response);
            });
        });
    });
</script>

{% endblock %}

我有一个视图/模板,其中列出了所有研究概念,并且每一行旁边都有一个创建新物流按钮。单击创建新物流按钮后,将打开模式/视图,允许您创建新物流。我想在单击按钮时传递对象研究概念的实例。

此外,CreateLogistics 是使用“from django.views.generic import CreateView”设计的基于类的视图

我非常乐意提供所需的任何进一步代码或信息。提前感谢所有的支持和帮助。

问候,

艾米·凯莱卡

【问题讨论】:

    标签: django python-3.x django-forms django-templates django-views


    【解决方案1】:

    您尚未显示您的 URL,但您需要接受 URL 中的 ID 用于 CreateView 并在 form_valid 中使用它。例如:

    path('/create_logistics/<int:id>/', LogisticsFormsetCreate.as_view(), name="create_Logistics"),
    

    所以在模板中你会这样做:

    <a class="btn btn-primary js-create-logistics" data-toggle="modal" data-target="#modal" href="{% url 'create_Logistics' id=studyRequestConcept.id %}">
    

    在视图中:

    def form_valid(self, form):
        ...
        self.object = form.save(commit=False)
        self.object.user = self.request.user
        self.object.studyConcept_id = self.kwargs['id']
        self.object.save()
        ...
    

    【讨论】:

    • 嗨@Daniel,我的URL代码是re_path(r'^createLogistics/$', login_required(views.LogisticsFormsetCreate.as_view()), name='create_Logistics'),但我会尝试实现我的代码由你解释。问候,
    • 嗨@Daniel,我在进行更改后收到此错误:“未找到带有关键字参数'{'id':1}'的'create_Logistics'的反向。1 种模式已尝试: ['createLogistics//$']"。我已将我的 url 模式更新为“re_path(r'^createLogistics//$', login_required(views.LogisticsFormsetCreate.as_view()), name='create_Logistics')”。请让我知道我是否错误地遵循了任何内容。问候,艾米·凯莱卡
    • 我的示例使用了path,而不是re_path
    • 我已将 re_path 更新为路径并进行了必要的更改,但是当我输入所有值并尝试创建新物流时,它给了我以下错误:“Reverse for 'create_Logistics ' 未找到任何参数。尝试了 1 种模式:['createLogistics\\/(?P[0-9]+)\\/$']"
    • 嗨@Daniel,您的解决方案有效,我只需要更改success_url = reverse_lazy('load_concepts')。感谢您的帮助和支持
    猜你喜欢
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多