Django传递外键形成

Django passing foreign key to form

我刚认识姜戈。

我需要从请求中获取ID,当创建表单时,我希望它从该值中获取complaintid字段的值,从表单本身中获取其余值。

型号.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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

视图.py

1
2
3
4
5
6
7
8
9
10
11
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)

表格.py

1
2
3
4
5
6
7
class FirForm(forms.ModelForm):
    class Meta:
        model=Fir
        fields=[
       "firid",
       "signedby",
       "content"]


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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
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()
        ...

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