Django - 通过表单保存模型不起作用
Django - saving model via a form is not working
我在使用 Django 中的 .save() 方法时遇到一点问题。对于一种形式,它有效,对于另一种形式,它不起作用。而且我找不到问题。
views.py
@login_required
def stock_add(request, portfolio_id):
if request.method == 'POST':
print('request.method is ok')
form = StockForm(request.POST)
print('form is ok')
if form.is_valid():
print('form is valid')
stock = form.save(commit=False)
stock.created_by = request.user
stock.portfolio_id = portfolio_id
stock.save()
return redirect('portfolio-overview')
else:
print("nope")
else:
print('else form statement')
form = StockForm()
context = {
'form':form
}
return render(request, 'portfolios/stock-add.html', context)
forms.py
class StockForm(ModelForm):
class Meta:
model = Stock
fields = ['quote', 'amount']
html
{% extends 'core/base.html' %}
{% block content %}
<div class="container">
<h1 class="title">Add Stock</h1>
<form method="POST" action=".">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="button is-primary">Submit</button>
</form>
</div>
{% endblock %}
型号
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Portfolio(models.Model):
title = models.CharField(max_length=56)
description = models.TextField(blank=True, null=True, max_length=112)
created_by = models.ForeignKey(User, related_name='portfolios', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'Portfolio'
def __str__(self):
return self.title
class Stock(models.Model):
Portfolio = models.ForeignKey(Portfolio, related_name='stocks', on_delete=models.CASCADE)
quote = models.CharField(max_length=10)
amount = models.IntegerField()
created_by = models.ForeignKey(User, related_name='stocks', on_delete=models.CASCADE)
created_at = models.DateField(auto_now_add=True)
def __str__(self):
return self.quote
如果你查看 views.py 文件,当我提交表单时,它甚至不会打印 ('request.method is ok')
我可以通过管理页面添加股票。
所以我不知道该去哪里找了...
干杯
当您 post 一个表单并且需要一个特殊的 url (就像您的带有属性的)时,我喜欢设置 action="{% url myview.views.stock_add portfolio_id %}"
action="."
将保存到同一页面而不考虑额外参数(如果需要)
只需在 context
中传递 portfolio_id
就可以了
我找到了答案,InteregerField(来自 models.py)需要一个默认值。
默认值=None(或其他值)。
干杯
我在使用 Django 中的 .save() 方法时遇到一点问题。对于一种形式,它有效,对于另一种形式,它不起作用。而且我找不到问题。
views.py
@login_required
def stock_add(request, portfolio_id):
if request.method == 'POST':
print('request.method is ok')
form = StockForm(request.POST)
print('form is ok')
if form.is_valid():
print('form is valid')
stock = form.save(commit=False)
stock.created_by = request.user
stock.portfolio_id = portfolio_id
stock.save()
return redirect('portfolio-overview')
else:
print("nope")
else:
print('else form statement')
form = StockForm()
context = {
'form':form
}
return render(request, 'portfolios/stock-add.html', context)
forms.py
class StockForm(ModelForm):
class Meta:
model = Stock
fields = ['quote', 'amount']
html
{% extends 'core/base.html' %}
{% block content %}
<div class="container">
<h1 class="title">Add Stock</h1>
<form method="POST" action=".">
{% csrf_token %}
{{ form.as_p }}
<button type="submit" class="button is-primary">Submit</button>
</form>
</div>
{% endblock %}
型号
from django.db import models
from django.contrib.auth.models import User
# Create your models here.
class Portfolio(models.Model):
title = models.CharField(max_length=56)
description = models.TextField(blank=True, null=True, max_length=112)
created_by = models.ForeignKey(User, related_name='portfolios', on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name_plural = 'Portfolio'
def __str__(self):
return self.title
class Stock(models.Model):
Portfolio = models.ForeignKey(Portfolio, related_name='stocks', on_delete=models.CASCADE)
quote = models.CharField(max_length=10)
amount = models.IntegerField()
created_by = models.ForeignKey(User, related_name='stocks', on_delete=models.CASCADE)
created_at = models.DateField(auto_now_add=True)
def __str__(self):
return self.quote
如果你查看 views.py 文件,当我提交表单时,它甚至不会打印 ('request.method is ok') 我可以通过管理页面添加股票。
所以我不知道该去哪里找了...
干杯
当您 post 一个表单并且需要一个特殊的 url (就像您的带有属性的)时,我喜欢设置 action="{% url myview.views.stock_add portfolio_id %}"
action="."
将保存到同一页面而不考虑额外参数(如果需要)
只需在 context
中传递 portfolio_id
就可以了
我找到了答案,InteregerField(来自 models.py)需要一个默认值。 默认值=None(或其他值)。
干杯