Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.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—创建新的模型对象会导致更新以前创建的对象_Python_Django - Fatal编程技术网

Python—创建新的模型对象会导致更新以前创建的对象

Python—创建新的模型对象会导致更新以前创建的对象,python,django,Python,Django,我正在使用Django创建一个名为CampaignProfile的模型,然后每个登录用户都可以填写一个表单来构建这样一个对象,并将其所有的“CampaignProfile”显示在个人仪表板上 我发现,当我填写此表单时,并没有像我需要的那样创建一个新的活动配置文件对象,而是输入的信息(标题等)替换了创建的第一个活动配置文件 我很难理解为什么要更新模型对象而不是创建新对象 Models.py: def get_file_name(instance, filename): return ('u

我正在使用Django创建一个名为CampaignProfile的模型,然后每个登录用户都可以填写一个表单来构建这样一个对象,并将其所有的“CampaignProfile”显示在个人仪表板上

我发现,当我填写此表单时,并没有像我需要的那样创建一个新的活动配置文件对象,而是输入的信息(标题等)替换了创建的第一个活动配置文件

我很难理解为什么要更新模型对象而不是创建新对象

Models.py:

def get_file_name(instance, filename):
    return ('uploads/%s_%s' % (str(time())).replace('.','_'), filename)

class CampaignProfile(models.Model):
    user = models.OneToOneField(UserModel, related_name='campaignprofile', on_delete=models.CASCADE, null=True)
    campaign_title = models.CharField(max_length=50, verbose_name='Title')
    campaign_dt_created = models.DateTimeField(auto_now_add=True, verbose_name='Date Created')
    campaign_dt_updated = models.DateTimeField(auto_now=True, verbose_name='Date Updated')
    campaign_docs = models.FileField(upload_to=get_file_name, verbose_name='Files', blank=True, null=True)

    slug = models.SlugField(unique=True, blank=True)

    class Meta:
        verbose_name = 'Campaign Profile'

    def __str__(self):
        return 'Campaign Title: ' + self.campaign_title + ' - ' + str(self.user)

    def save(self, *args, **kwargs):
        if self.user is None:  # Set default reference
            self.user = UserModel.objects.get(id=pk)
        super(CampaignProfile, self).save(*args, **kwargs)
Forms.py

class NewCampaignForm(forms.ModelForm):
    campaign_title = forms.CharField(min_length=1, max_length=80, label='Campaign Name', required=True,
    widget=forms.TextInput(attrs={'autofocus':'autofocus'}))
    campaign_docs = forms.FileField(label='Attach .png and .docx files to your campaign', required=False,
    widget=forms.ClearableFileInput(attrs={'id':'fileupl'}))

    class Meta:
        model = CampaignProfile
        fields = ['campaign_title', 'campaign_docs']

    def clean(self):
        cleaned_data = super(NewCampaignForm, self).clean()
        return self.cleaned_data

    def save(self, commit=True):
        campaign = super(NewCampaignForm, self).save(commit=False)
        if commit:
            campaign.save()
        return campaign
Views.py

def campaign_create(request):
    user=request.user.id
    if request.user.is_authenticated:
        try:
            campaign = request.user.campaignprofile
        except CampaignProfile.DoesNotExist:
            campaign = CampaignProfile(user)
        if request.method == 'POST':
            form = NewCampaignForm(request.POST, request.FILES, instance=campaign)
            if form.is_valid():
                form.save()
                return redirect('/dashboard/')
            else:
                form = NewCampaignForm(instance=campaign)
            return render(request, 'campaign-create.html', {'form': form})
        else:
            form = NewCampaignForm()
        return render(request, 'campaign-create.html', {'form': form})
    else:
        return redirect('/users/login/')
我在提交表单时没有收到任何错误,并尝试了一些不同的代码


任何帮助都会很好,谢谢。

因为您已将与用户的关系定义为一对一。根据定义,这意味着用户只能有一个配置文件


如果要允许多个配置文件,请改用ForeignKey。

我将OneToOneField更改为ForeignKey,并从我的views.py中删除了'instance=campaign',但这次提交表单时,它只返回一个空表单,不会创建新的配置文件对象,也不会更新旧对象。你知道为什么它不保存新的表单条目吗?嗯,可能表单是无效的,但是你通过在else子句中重新实例化表单来隐藏任何错误。不要那样做。