Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django'分配外键;s CreateView_Python_Django - Fatal编程技术网

Python 使用Django'分配外键;s CreateView

Python 使用Django'分配外键;s CreateView,python,django,Python,Django,我一整天都在和这件事搏斗。我正试图想出一个解决方案,在每个表单中保存多张图片。我觉得我好像在家里,但我现在的问题是,我不能在提交表单时自动分配ForeignKey。以下代码在各个方面都起作用,但没有FK应用于DB记录。非常感谢您的帮助 正在尝试通过: FA_Attachments.objects.create( image=f,field_evaluations = request.POST.get('order')) 只是给我: Cannot assi

我一整天都在和这件事搏斗。我正试图想出一个解决方案,在每个表单中保存多张图片。我觉得我好像在家里,但我现在的问题是,我不能在提交表单时自动分配ForeignKey。以下代码在各个方面都起作用,但没有FK应用于DB记录。非常感谢您的帮助

正在尝试通过:

FA_Attachments.objects.create(
                    image=f,field_evaluations = request.POST.get('order'))
只是给我:

Cannot assign "'test'": "FA_Attachments.field_evaluation" must be a "FieldEvaluation" instance.
型号.py

from django.db import models


class FieldEvaluation(models.Model):
    "Our default field evaluation form"
    created_at = models.DateTimeField(auto_now_add=True)
    order = models.CharField(max_length=50)


class FA_Attachments(models.Model):
    field_evaluation = models.ForeignKey(
        FieldEvaluation, on_delete=models.CASCADE, null=True)
    image = models.ImageField(upload_to='photos')
from django import forms
from .models import FieldEvaluation, FA_Attachments


class FieldEvaluationForm(forms.ModelForm):
    class Meta:
        model = FieldEvaluation
        fields = ['order']  # not attachments!

    attachments = forms.ImageField(
        widget=forms.ClearableFileInput(attrs={'multiple': True}))
from django.views.generic.edit import CreateView
from django.shortcuts import render
from .forms import *
from .models import *


class FieldEvaluationView(CreateView):
    model = FieldEvaluation
    form_class = FieldEvaluationForm
    template_name = 'QA.html'
    success_url = '?success'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('attachments')
        if form.is_valid():
            for f in files:
                FA_Attachments.objects.create(
                    image=f)
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
Forms.py

from django.db import models


class FieldEvaluation(models.Model):
    "Our default field evaluation form"
    created_at = models.DateTimeField(auto_now_add=True)
    order = models.CharField(max_length=50)


class FA_Attachments(models.Model):
    field_evaluation = models.ForeignKey(
        FieldEvaluation, on_delete=models.CASCADE, null=True)
    image = models.ImageField(upload_to='photos')
from django import forms
from .models import FieldEvaluation, FA_Attachments


class FieldEvaluationForm(forms.ModelForm):
    class Meta:
        model = FieldEvaluation
        fields = ['order']  # not attachments!

    attachments = forms.ImageField(
        widget=forms.ClearableFileInput(attrs={'multiple': True}))
from django.views.generic.edit import CreateView
from django.shortcuts import render
from .forms import *
from .models import *


class FieldEvaluationView(CreateView):
    model = FieldEvaluation
    form_class = FieldEvaluationForm
    template_name = 'QA.html'
    success_url = '?success'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('attachments')
        if form.is_valid():
            for f in files:
                FA_Attachments.objects.create(
                    image=f)
            return self.form_valid(form)
        else:
            return self.form_invalid(form)
视图.py

from django.db import models


class FieldEvaluation(models.Model):
    "Our default field evaluation form"
    created_at = models.DateTimeField(auto_now_add=True)
    order = models.CharField(max_length=50)


class FA_Attachments(models.Model):
    field_evaluation = models.ForeignKey(
        FieldEvaluation, on_delete=models.CASCADE, null=True)
    image = models.ImageField(upload_to='photos')
from django import forms
from .models import FieldEvaluation, FA_Attachments


class FieldEvaluationForm(forms.ModelForm):
    class Meta:
        model = FieldEvaluation
        fields = ['order']  # not attachments!

    attachments = forms.ImageField(
        widget=forms.ClearableFileInput(attrs={'multiple': True}))
from django.views.generic.edit import CreateView
from django.shortcuts import render
from .forms import *
from .models import *


class FieldEvaluationView(CreateView):
    model = FieldEvaluation
    form_class = FieldEvaluationForm
    template_name = 'QA.html'
    success_url = '?success'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('attachments')
        if form.is_valid():
            for f in files:
                FA_Attachments.objects.create(
                    image=f)
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

你不能保存外键

首先,我建议您强制执行附件关系:

class FA_Attachments(models.Model):
    field_evaluation = models.ForeignKey(
        FieldEvaluation, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='photos')
我删除了
null=True
,因为该模型与FieldEvaluation严格相关

然后你必须修改你的帖子

class FieldEvaluationView(CreateView):
    model = FieldEvaluation
    form_class = FieldEvaluationForm
    template_name = 'QA.html'
    success_url = '?success'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('attachments')

        # your form must have it!
        order = request.POST.get('order')
        fe = FieldEvaluation.objects.create(order=order)

        if form.is_valid():
            for f in files:
                # here you create the relation with the FieldEvaluation
                FA_Attachments.objects.create(
                    image=f, field_evaluation=fe)
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

你不能保存外键

首先,我建议您强制执行附件关系:

class FA_Attachments(models.Model):
    field_evaluation = models.ForeignKey(
        FieldEvaluation, on_delete=models.CASCADE)
    image = models.ImageField(upload_to='photos')
我删除了
null=True
,因为该模型与FieldEvaluation严格相关

然后你必须修改你的帖子

class FieldEvaluationView(CreateView):
    model = FieldEvaluation
    form_class = FieldEvaluationForm
    template_name = 'QA.html'
    success_url = '?success'

    def post(self, request, *args, **kwargs):
        form_class = self.get_form_class()
        form = self.get_form(form_class)
        files = request.FILES.getlist('attachments')

        # your form must have it!
        order = request.POST.get('order')
        fe = FieldEvaluation.objects.create(order=order)

        if form.is_valid():
            for f in files:
                # here you create the relation with the FieldEvaluation
                FA_Attachments.objects.create(
                    image=f, field_evaluation=fe)
            return self.form_valid(form)
        else:
            return self.form_invalid(form)

我会选择覆盖
form\u valid
而不是
post
方法。在
表单\u valid
中,您可以保存字段\u评估对象,然后将此新对象分配给ForeignKey字段。最后调用并返回
form\u valid
,form作为参数

class FieldEvaluationView(CreateView):
        model = FieldEvaluation
        form_class = FieldEvaluationForm
        template_name = 'QA.html'
        success_url = '?success'

        def form_valid(self, form):
            field_evaluation_obj = form.save(commit=True)
            files = self.request.FILES.getlist('attachments')
            for f in files:
                FA_Attachments.objects.create(image=f, field_evaluation=field_evaluation_obj)
            return super(FieldEvaluationView, self).form_valid(form)

我会选择覆盖
form\u valid
而不是
post
方法。在
表单\u valid
中,您可以保存字段\u评估对象,然后将此新对象分配给ForeignKey字段。最后调用并返回
form\u valid
,form作为参数

class FieldEvaluationView(CreateView):
        model = FieldEvaluation
        form_class = FieldEvaluationForm
        template_name = 'QA.html'
        success_url = '?success'

        def form_valid(self, form):
            field_evaluation_obj = form.save(commit=True)
            files = self.request.FILES.getlist('attachments')
            for f in files:
                FA_Attachments.objects.create(image=f, field_evaluation=field_evaluation_obj)
            return super(FieldEvaluationView, self).form_valid(form)

非常感谢。该null=true用于在前面查找另一个bug。好地方。不幸的是,您发布的解决方案给了我:“无法分配”'test':“FA_Attachments.field_evaluation”必须是一个“FieldEvaluation”实例。这就是让我感到困惑的地方。它非常困惑您的模型,但我修复了我的代码,现在它可以工作了。谢谢!该null=true用于在前面查找另一个bug。好地方。不幸的是,您发布的解决方案给了我:“无法分配”'test':“FA_Attachments.field_evaluation”必须是一个“FieldEvaluation”实例。这就是让我感到困惑的地方。它非常混乱您的模型,但我修复了我的代码,现在它可以工作了。对。这是合乎逻辑的,因为您使用此对象将其作为外键。我已经编辑了答案。对。这是合乎逻辑的,因为您使用此对象将其作为外键。我已经编辑了答案。