Django传递外键以形成

时间:2016-04-15 09:11:35

标签: django django-models django-forms

我是django的新手。

我需要从请求中获取id,并且在创建表单时,我希望它从此值生成抱怨字段的值,并从表单本身休息。

models.py

class Complaint(models.Model):
    complaintid= models.AutoField(primary_key=True)
    dateofcomplaint=models.DateTimeField(auto_now=False, auto_now_add=True)
    content = models.TextField()
    policestation= models.CharField(max_length=120)
    location=models.TextField()

    def __unicode__(self):
        return unicode(self.complaintid)
    def __str__(self):
        return self.complaintid
    def get_absolute_url(self):
        return reverse("crimefiles:detail", kwargs={"id":self.complaintid}) 

class Fir(models.Model):
    firid=models.CharField(max_length=10,primary_key=True)
    complaintid=models.ForeignKey(Complaint,default=None)
    signedby= models.CharField(max_length=20)
    content=models.TextField(default="First Information Report")

    def  __unicode__(self):
        return self.firid

    def __str__(self):
        return self.firid

views.py

def fir_create(request,id=None):
    form =FirForm(request.POST or None)
    if form.is_valid():
        instance=form.save(commit=False)
        instance.save()
        messages.success(request,"sucessfully Created")
        return HttpResponseRedirect()
    context={
    "form":form
    }
    return render(request,"fir_form.html",context)

forms.py

class FirForm(forms.ModelForm):
    class Meta:
        model=Fir
        fields=[
        "firid",
        "signedby",
        "content"]

1 个答案:

答案 0 :(得分:1)

您已使用commit=False保存,只需在调用instance.save()之前设置投诉字段。

您可以使用get_object_or_404确保id是有效的投诉ID。

from django.shortcuts import get_object_or_404

def fir_create(request,id=None):
    if id is not None:
        complaint = get_object_or_404(Complaint, id=id)
    else:
        complaint = None
    form =FirForm(request.POST or None)
    if form.is_valid():
        instance=form.save(commit=False)
        instance.complaint = complaint
        instance.save()
        ...

请注意,您可能需要添加更多验证。 - 目前,用户只需更改网址中的ID即可更改投诉。