2016-05-13 169 views
0

我试图挽救视图中的数据,我的两个型号有:无法外键对象保存到model.cc

models.py

class Customer(models.Model) : 
    name = models.CharField(max_length=25) 
    address = models.CharField(max_length=250) 
    phone_number = models.IntegerField() 
    email = models.EmailField(max_length=35) 
    contact_person = models.CharField(max_length=25) 
    created_date = models.DateTimeField(auto_now_add=True, null=True) 

    def __str__(self): 
     return self.name 

class Product(models.Model): 
    support = models.CharField(max_length=8, choices=support_choice, null=True) 
    amc_date = models.DateField(null=True) 
    amc_product = models.CharField(max_length=500, default="No Products in amc") 
    warranty_date = models.DateField(null=True) 
    warranty_product_list = models.CharField(max_length=500, default="No Products in warranty") 
    product_name = models.CharField(max_length=100, null=True) 
    serial_number = models.CharField(max_length=50, null=True) 
    customer = models.ForeignKey(Customer) 

    def __str__(self): 
     return self.product_name 

我创建了一个形式为产品:

class ProductForm(forms.ModelForm): 
support = forms.ChoiceField(choices=support_choice, required=True,) 
amc_date = forms.DateField(required=False, widget=forms.TextInput(attrs={'placeholder': 'ex: 10/25/2006'})) 
amc_product = forms.CharField(required=False, widget=forms.TextInput(attrs={'placeholder': 'Products listed in AMC'})) 
warranty_date = forms.DateField(required=False, widget=forms.TextInput(attrs={'placeholder': 'ex: 10/25/2006'})) 
warranty_product_list = forms.CharField(required=False, widget=forms.TextInput(attrs={'placeholder': 'Products listed in warranty'})) 
product_name = forms.CharField(required=True, widget=forms.TextInput(attrs={'placeholder':'Product model'})) 
serial_number = forms.CharField(required=True) 

class Meta: 
    model = Product 
    fields = ['support', 'amc_date', 'amc_product', 'warranty_date', 'warranty_product_list', 'product_name', 
       'serial_number'] 

在我的views.py我试图将外键对象保存到产品数据库,但我得到一个错误“不能分配‘‘Sabaree’’:‘Product.customer’必须是一个“C ustomer“实例”。

views.py

def product_detail(request): 
cust = request.POST.get('customer_name') 
obj = Customer.objects.all() 
obj1 = obj.filter(name=cust) 
print (cust) 
if request.method == 'POST': 
    form = ProductForm(request.POST) 
    if form.is_valid(): 

     a = form.save(commit=False) 
     a.customer = cust 
     form.save() 

context = {'obj':obj, 'form':form} 
return render(request,"products.html",context) 

和我的模板是: products.html放在

{% block content %} 
<script type="text/javascript" src="//code.jquery.com/jquery-1.12.0.min.js"></script> 
<script src="{% static 'js/product_detail.js' %}"></script> 
<div class="container"> 
    <h2>Products</h2> 
    <form method="post" action="" enctype="multipart/form-data"> 
    {% csrf_token %} 
    <div class="controls "> 
    <select class="select form-control" id="id_customer_name" name="customer_name"> 
     {% for i in obj %} 
      <option id="{{ i.id }}" value="{{ i.name }}">{{ i.name }}{{ i.id }}</option> 
     {% endfor %} 
    </select> 
    </div> 
    {{ form|crispy }} 
    <input type="submit" class="btn btn-default " value="Submit"> 
</form> 
</div> 
{% endblock %} 

我不知道如何拯救被分配在产品表的外键的数据。

回答

0

由于Customer是外键,您无法分配您从POST方法获得的值。试试下面的这

a.customer.name = cust 

或将其转换为客户表对象如下

cust_obj = Customer.objects.get(name=cust) # Assuming cust is unique or do a query to return obj 
then while save, 
a.customer = cust 
+0

我试图使用你所提到的方法,而是名字的我得到的记录的ID,因为形式发送POST中客户名称的ID以及其保存在数据库中的名称。 'CUST = request.POST.get( 'CUSTOMER_NAME') cust_obj = Customer.objects.get(ID = CUST) 一个=产品(支持=支持1,amc_date = amc_date1,amc_product = amc_product1,warranty_date = warranty_date1, warranty_product_list = warranty_product_list1,product_name = product_name1,serial_number = serial_number1,customer = cust_obj) a.save()' 感谢您给我一些指导。 – itsecurity