ForeignKey以酥脆的形式保存数据

时间:2020-09-21 14:42:49

标签: django-models django-forms django-views foreign-keys django-crispy-forms

嗨,我有这两个模型,我有与第一个模型相关的ForeignKey字段。

 class WELLMod(models.Model):
    WellID    = models.CharField(max_length=15,unique=True)
    Perimetre = models.CharField(max_length=50)
    post_date   = models.DateTimeField(default=timezone.now)
    author      = models.ForeignKey(User,on_delete=models.CASCADE)
    def __str__(self):
        return self.WellID
    def get_absolute_url(self):
        return reverse('WellDt', args=[self.pk])
    class Meta:
        ordering = ('-post_date',)


class DSTMod(models.Model):
    WellID    = models.ForeignKey(WELLMod ,to_field='WellID', on_delete=models.CASCADE) 
    TotalDpt      = models.CharField(max_length=15)
    post_date   = models.DateTimeField(default=timezone.now)
    author      = models.ForeignKey(User,on_delete=models.CASCADE)
    def __str__(self):
        return self.WellID_id
    def get_absolute_url(self):
        return reverse('WellDt', args=[self.WellID_id.pk])
    class Meta:
        ordering = ('-post_date',)

#formes.py

class WELLForm(forms.ModelForm):
    WellID = forms.CharField(label='Well ID',max_length=15)
    Perimetre = forms.ChoiceField(label='Perimetre',max_length=15,required =False)
    class Meta:
        model= WELLMod
        fields=['WellID','Perimetre']

class DSTMForm(forms.ModelForm):
    WellID_id = forms.CharField(label='Well Name',max_length=15)
    TotalDpt  = forms.CharField(label='Total Depth(m)',max_length=15,required =False)
    class Meta:
        model= DSTMod
        fields=['WellID','TotalDpt']

Views.py

class PostCreateWell(LoginRequiredMixin, CreateView): 
    model = WELLMod
    template_name = 'Home/WELLINFO/Add_well.html'
    form_class = WELLForm
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)


class PostCreateDST(LoginRequiredMixin, CreateView):
    model = DSTMod
    template_name = 'Home/WELLINFO/WellDST/Add_DST.html'
    form_class = WELLForm
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

url.py

path('Add_well/', views.PostCreateWell.as_view(), name='NEWWELL'),
path('Add_Dst/', views.PostCreateDST.as_view(), name='WellDST'),

我的模板是

<form method="POST">
    {% csrf_token %}
      <!-- form  from views.py-->
<div class="border p-2 mb-3 mt-3 border-secondary">
    <h3>Drill Stem Test</h3>
    <div class="form-row">
        <div class="form-group col-md-4 mb-0">{{ form.WellID|as_crispy_field }}</div>
        <div class="form-group col-md-4 mb-0">{{ form.TotalDpt|as_crispy_field }}</div>
    </div>
</div>
    <input class="btn btn-success mb-4" type="submit" value="ADD WELL">
</form>

问题是,当我添加一口井时,它会很好地工作,但是当添加DSTMOD时,它不会保存我的数据,并且不会出现错误地翻页吗?为什么以及如何解决这个问题? 注意,当我使用管理工具添加数据时,效果很好。

2 个答案:

答案 0 :(得分:0)

通过更改以下内容来解决保存数据的问题:

class DSTMForm(forms.ModelForm):
    WellID_id    = forms.CharField(label='Well Name',max_length=15)
    TotalDpt      = forms.CharField(label='Total Depth(m)',max_length=15,required =False)
    DSTr      = forms.CharField(label='DST Result', widget = forms.Textarea(),required =False)
    class Meta:
        model= DSTMod
        fields=['WellID_id','TotalDpt']



<form method="POST">
        {% csrf_token %}
          <!-- form  from views.py-->
    <div class="border p-2 mb-3 mt-3 border-secondary">
        <h3>Drill Stem Test</h3>
        <div class="form-row">
            <div class="form-group col-md-4 mb-0">{{ form.WellID_id|as_crispy_field }}</div>
            <div class="form-group col-md-4 mb-0">{{ form.TotalDpt|as_crispy_field }}</div>
        </div>
    </div>
        <input class="btn btn-success mb-4" type="submit" value="ADD WELL">
</form>

另一个问题是,当我保存数据时,它会保存除第一个字段以外的所有其他字段

它是空的!我不知道为什么?

enter image description here

答案 1 :(得分:0)

最后我得到了答案 https://docs.djangoproject.com/en/3.1/topics/forms/modelforms/

我添加了form.ModelChoiceField及其查询集。

class DSTMForm(forms.ModelForm):
    WellID    = forms.ModelChoiceField(label='Well Name',queryset=Wellinfo.objects.all())
    TotalDpt  = forms.CharField(label='Total Depth(m)',max_length=15,required =False)
    DSTr      = forms.CharField(label='DST Result', widget = forms.Textarea(),required =False)
    class Meta:
        model= DSTMod
        fields=['WellID','TotalDpt']


<form method="POST">
        {% csrf_token %}
          <!-- form  from views.py-->
    <div class="border p-2 mb-3 mt-3 border-secondary">
        <h3>Drill Stem Test</h3>
        <div class="form-row">
            <div class="form-group col-md-4 mb-0">{{ form.WellID|as_crispy_field }}</div>
            <div class="form-group col-md-4 mb-0">{{ form.TotalDpt|as_crispy_field }}</div>
        </div>
    </div>
        <input class="btn btn-success mb-4" type="submit" value="ADD WELL">
</form>