Django get_或_create未取回数据

Django get_或_create未取回数据,django,django-views,bootstrap-modal,Django,Django Views,Bootstrap Modal,我已经为模式表单(弹出窗口)创建了一个FBV,我希望有相同的视图来处理创建和更新,我使用FBV的原因是我通过查询分配外键,而不是通过URL传递id。请注意,我使用JS脚本调用模态并在其中呈现表单 **Models.py:** class Startup ( models.Model ) : author = models.OneToOneField ( User , on_delete = models.CASCADE ) startup_name = models.CharF

我已经为模式表单(弹出窗口)创建了一个FBV,我希望有相同的视图来处理创建和更新,我使用FBV的原因是我通过查询分配外键,而不是通过URL传递id。请注意,我使用JS脚本调用模态并在其中呈现表单

**Models.py:**

class Startup ( models.Model ) :
    author = models.OneToOneField ( User , on_delete = models.CASCADE )
    startup_name = models.CharField ( 'Startup Name' , max_length = 32 , null = False , blank = False )

class Startup_About ( models.Model ) :
    str_about = models.OneToOneField ( Startup , on_delete = models.CASCADE )
    about = models.TextField ( 'About Startup' , max_length = 2000 , null = False , blank = False )
    problem = models.TextField ( 'Problem/Opportunity' , max_length = 2000 , null = False , blank = False )
    business_model = models.TextField ( 'Business Monitization Model' , max_length = 2000 , null = False ,blank = False )
    offer = models.TextField ( 'Offer to Investors' , max_length = 2000 , null = False , blank = False )

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

**forms.py:**

class startupform(forms.ModelForm):
    class Meta:
        model = Startup
        fields = ('startup_name',)
        widgets = {
            'startup_name': forms.TextInput(attrs = {'class':'form-control'}),
        }

    def clean(self):
        super ( ).clean ( )
        startup_name = self.cleaned_data.get ( 'startup_name' )
        startup_qs = Startup.objects.filter ( startup_name = startup_name )
        if startup_qs.exists ( ):
            raise forms.ValidationError ( 'This Startup Already Exist!' )

class startupaboutform(forms.ModelForm):
    class Meta:
        model = Startup_About
        fields = ('about','problem','business_model','offer',)
        widgets = {
            'about' : forms.Textarea ( attrs = { 'class' : 'form-control' } ) ,
            'problem' : forms.Textarea ( attrs = { 'class' : 'form-control' } ) ,
            'business_model' : forms.Textarea ( attrs = { 'class' : 'form-control' } ) ,
            'offer' : forms.Textarea ( attrs = { 'class' : 'form-control' } ) ,
        }

**Views.py:**

@login_required
@str_required
def create_startupform(request):
    q = Startup.objects.filter(author=request.user)
    if q.exists():
        return redirect ( 'appwizard')
    else:
        form = startupform ( request.POST or None )
        if form.is_valid ( ) :
            instance = form.save (commit = False)
            instance.author = request.user
            instance.save()
            return redirect ( 'appwizard', pk = instance.pk )
        else:
            form = startupform()
        return render ( request , 'str_name.html' , { 'form' : form } )

decorators = [str_required, login_required]

@method_decorator(login_required, name='dispatch')
@method_decorator(str_required, name='dispatch')
class aboutview(FormView):
    template_name = 'create_about.html'
    form_class = startupaboutform

@login_required
@str_required
def create_startupaboutform(request) :
    q = Startup.objects.filter ( author = request.user )[0]
    R = get_object_or_404(Startup, startup_name=q)
    if request.method == 'POST':
        form = startupaboutform ( request.POST )
        stup = Startup_About.objects.get_or_create(str_about=R )[0]
        if form.is_valid ( ) :
            instance = form.save ( commit = False )
            instance.str_about = R
            instance.save ( )
            return redirect('/appwizard/')
        else :
            form = startupaboutform ()
        return render ( request , 'create_about.html' , { 'form' : form } )

**urls.py:**

urlpatterns = [

    path ( 'appwizard/' , views.applicationwizard , name = 'appwizard' ) ,
    path('create_startupaboutform/', views.create_startupaboutform, name='create_startupaboutform'),
    path ( 'aboutview/' , views.aboutview.as_view() , name = 'aboutview' ) ,

]

**Template - appwizard:**

{% load static %}
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="{% static 'assets/bootstrap/css/bootstrap.min.css' %}">

</head>
<body>


<a href="#"  id="btn" class="btn btn-info btn-lg">Open Modal</a>


{% include "create_about.html" %}


<script src="{% static 'assets/js/jquery.min.js' %}"></script>
    <script src="{% static 'assets/bootstrap/js/bootstrap.min.js' %}"></script>

<script>
     $(document).ready(function(){
             $("#btn").on("click", function(){
                 $("#form").load("{% url 'aboutview' %}", function(){
                 $("#about").modal("show");
             });
             });
     });
</script>

</body>
</html>

**Template - creaye_about - form in a Modal:**

<form id="form" method="post" action="{% url 'create_startupaboutform' %}">
    {% csrf_token %}
<div class="modal fade" id="about" role="dialog" tabindex="-1">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title">Modal Title</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span
                        aria-hidden="true">×</span></button>
            </div>
            <div class="modal-body">
                {{form}}
            </div>
            <div class="modal-footer">
                <button class="btn btn-light" type="button" data-dismiss="modal">Close</button>
                <button class="btn btn-primary" type="submit">Save</button>
            </div>
        </div>
    </div>
</div>
</form>
```
**Models.py:**
类启动(models.Model):
author=models.OneToOneField(用户,on_delete=models.CASCADE)
startup_name=models.CharField('startup name',max_length=32,null=False,blank=False)
类启动\u关于(models.Model):
str_about=models.OneToOneField(启动时,删除=models.CASCADE)
about=models.TextField('about Startup',max_length=2000,null=False,blank=False)
problem=models.TextField('problem/Opportunity',max_length=2000,null=False,blank=False)
business_model=models.TextField('business moninization model',max_length=2000,null=False,blank=False)
offer=models.TextField('offer to Investors',max_length=2000,null=False,blank=False)
定义(自我):
返回str(self.str\u about)
**forms.py:**
类startupform(forms.ModelForm):
类元:
模型=启动
字段=('startup_name',)
小部件={
'startup_name':forms.TextInput(attrs={'class':'form-control'}),
}
def清洁(自清洁):
super().clean()
startup\u name=self.cleaned\u data.get('startup\u name')
startup\u qs=startup.objects.filter(startup\u name=startup\u name)
如果startup_qs.exists():
raise forms.ValidationError('此启动已存在!')
类startupaboutform(forms.ModelForm):
类元:
模型=启动\u关于
字段=('about'、'problem'、'business_model'、'offer'、)
小部件={
'about':forms.Textarea(attrs={'class':'form control'}),
“问题”:forms.Textarea(attrs={'class':'form control'}),
'business_model':forms.Textarea(attrs={'class':'form control'}),
'offer':forms.Textarea(attrs={'class':'form control'}),
}
**Views.py:**
@需要登录
@需要str_
def创建表格(请求):
q=Startup.objects.filter(author=request.user)
如果q.存在():
返回重定向('appwizard')
其他:
表单=启动表单(request.POST或None)
如果form.u有效():
instance=form.save(commit=False)
instance.author=request.user
save()实例
返回重定向('appwizard',pk=instance.pk)
其他:
form=startupform()
返回呈现(请求'str_name.html',{'form':form})
decorators=[str_必需,login_必需]
@方法\u装饰器(需要登录,name='dispatch')
@方法\u装饰器(需要str\u,name='dispatch')
类aboutview(FormView):
模板名称='create\u about.html'
form_class=startupaboutform
@需要登录
@需要str_
def创建_startupaboutform(请求):
q=Startup.objects.filter(author=request.user)[0]
R=获取对象或404(启动,启动名称=q)
如果request.method==“POST”:
表单=startupaboutform(request.POST)
stup=Startup\u About.objects.get\u或\u create(str\u About=R)[0]
如果form.u有效():
instance=form.save(commit=False)
instance.str_about=R
instance.save()
返回重定向(“/appwizard/”)
其他:
form=startupaboutform()
返回呈现(请求'create_about.html',{'form':form})
**URL.py:**
URL模式=[
路径('appwizard/',views.applicationwizard,name='appwizard'),
路径('create_startupaboutform/',views.create_startupaboutform,name='create_startupaboutform'),
路径('aboutview/',views.aboutview.as_view(),name='aboutview'),
]
**模板-应用程序向导:**
{%load static%}
文件
{%include“create_about.html”%}
$(文档).ready(函数(){
$(“#btn”)。在(“单击”,函数(){
$(“#form”).load(“{%url”aboutview“%”),函数(){
$(#about”).modal(“show”);
});
});
});
**模板-creaye_about-模态中的形式:**
{%csrf_令牌%}
情态标题
×
{{form}}
接近
拯救
```

您的
clean
方法应返回已清理的数据,因此:

class startupform(forms.ModelForm):
    class Meta:
        model = Startup
        fields = ('startup_name',)
        widgets = {
            'startup_name': forms.TextInput(attrs = {'class':'form-control'}),
        }

    def clean(self):
        cleaned_data = super().clean()
        startup_name = cleaned_data.get('startup_name')
        startup_qs = Startup.objects.filter(startup_name=startup_name)
        if startup_qs.exists():
            raise forms.ValidationError('This Startup Already Exist!')
        return cleaned_data

您的
clean
方法应返回已清理的数据,因此:

class startupform(forms.ModelForm):
    class Meta:
        model = Startup
        fields = ('startup_name',)
        widgets = {
            'startup_name': forms.TextInput(attrs = {'class':'form-control'}),
        }

    def clean(self):
        cleaned_data = super().clean()
        startup_name = cleaned_data.get('startup_name')
        startup_qs = Startup.objects.filter(startup_name=startup_name)
        if startup_qs.exists():
            raise forms.ValidationError('This Startup Already Exist!')
        return cleaned_data

感谢您的输入,但我的问题在于第二个视图create_startupaboutform,但是,如果我是唯一用户,这是否意味着不需要进行表单验证?感谢您的输入,但我的问题在于第二个视图create_startupaboutform,应该使用Update_或_create而不是Get_或_create函数来简化问题,如何限制用户在创建模型对象时只能更新,不允许再次访问创建视图。感谢您的输入,但我的问题是第二个视图create_startupaboutform,如果i user Unique,这是否意味着不需要进行表单验证?感谢您的输入,但我的问题是第二个视图create_startupboutform,应该使用Update_或_create而不是Get_或_create函数来简化问题,如何限制用户在创建模型对象时只能更新,不允许再次访问创建视图。