【发布时间】:2017-11-02 06:41:28
【问题描述】:
我无法在数据库中保存 MEDIA_CHOICES 我不知道为什么!保存市场参数。但是我对以 MEDIA_CHOICES 作为输入的扇区参数有疑问,用户选择输入但保存后它在数据库中为空。我找不到问题出在哪里。 Image here the user need to check sector than save the value,when i access to the saved page i find the sector field empty not saved
class Media(models.Model):
Media_Choices= models.CharField(max_length=30, choices=MEDIA_CHOICES)
class Parameters(models.Model):
user = models.ForeignKey(User)
title = models.CharField('title', max_length=100, default='', blank=True, help_text='Use an indicative name, related to the chosen parameters')
type = models.CharField('forecast type', choices=FORECAST_TYPES, max_length=20, default="backtest")
#input characteristics
price_1_min = models.FloatField('1. Price, min', default=0.1, validators=[MinValueValidator(0.1), MaxValueValidator(20000)])
price_1_max = models.FloatField('1. Price, max', default=20000, validators=[MinValueValidator(0.1), MaxValueValidator(20000)])
stocks_num_2_min = models.IntegerField('2. Number of selected stock, min', default=3, validators=[MinValueValidator(0), MaxValueValidator(100)])
stocks_num_2_max = models.IntegerField('2. Number of selected stock, max', default=7, validators=[MinValueValidator(1),])
limit_3 = models.FloatField('3. Last price to upper straight, %', default=20, validators=[MinValueValidator(-200),])
learning_days_4_min = models.IntegerField('4. Number of Learning days, min', default=1, validators=[MinValueValidator(1),MaxValueValidator(30)])
learning_days_4_max = models.IntegerField('4. Number of Learning days, max', default=10, validators=[MinValueValidator(1),MaxValueValidator(30)])
evaluation_days_5 = models.IntegerField('5. Number of Evaluation days', default=10, validators=[MinValueValidator(1),MaxValueValidator(10)])
delay_days_6 = models.IntegerField('6. Number of “no quarterly reports” days (N)', default=10, validators=[MinValueValidator(0),MaxValueValidator(20)])
minimum_gain_7 = models.FloatField('7. Minimum gains for winners', default=0, validators=[MinValueValidator(0),MaxValueValidator(100)])
minimum_loss_8 = models.FloatField('8. Minimum losses for losers', default=0, validators=[MinValueValidator(-100),MaxValueValidator(0)])
total_gain_min_9 = models.FloatField('9. Minimum total gain', default=0, validators=[MinValueValidator(0),MaxValueValidator(100)])
winning_stock_percentage_min_10 = models.FloatField('10. Minimum percentage of winning stocks', default=60, validators=[MinValueValidator(0),MaxValueValidator(100)])
market = models.CharField('Market', max_length=30, null=True)
sector= models.ManyToManyField(Media)
forms.py:
class BacktestForm(forms.ModelForm):
period_start = forms.DateField(initial=datetime.datetime.today().date() - datetime.timedelta(days=365+16), widget=forms.widgets.DateInput(format="%Y/%m/%d"), input_formats=["%Y/%m/%d"])
period_end = forms.DateField(initial=datetime.datetime.today().date() - datetime.timedelta(days=16), widget=forms.widgets.DateInput(format="%Y/%m/%d"), input_formats=["%Y/%m/%d"])
market = forms.MultipleChoiceField(label='Market', choices=Parameters.MARKET, widget=forms.CheckboxSelectMultiple)
class Meta:
model = Parameters
exclude = [
'user',
'type',
'created_at',
'updated_at',
]
widgets={
'title': forms.TextInput(attrs={'placeholder':'for ex. highLimitLowPrice'}),
'sector': forms.CheckboxSelectMultiple(),
}
views.py
def backtest(request, pk=None):
if pk is not None:
param = get_object_or_404(Parameters, pk=pk, user=request.user)
form = BacktestForm(request.POST or None, instance=param)
else:
form = BacktestForm(request.POST or None)
if request.method == 'POST':
if form.is_valid():
if 'save' in request.POST:
obj = form.save(commit= False)
obj.user = request.user
obj.type = "backtest"
obj.save()
messages.info(request, 'Saved!')
return redirect(obj.get_backtest_url())
else:
messages.info(request, 'Please check entered data')
data = {
'active_page': 'backtest',
'form': form,
}
错误在 HTML 中(form.sector 不可迭代):
<td>{{form.sector.label}}</td>
<td> {{form.sector}} </td>
</tr>
【问题讨论】:
-
在您的模型中,您已将扇区定义为字符域。但是在表单中,您正在使用 MultipleChoiceField 并尝试将所有选定的选项保存到 db。它不是那样工作的。尝试对扇区使用 ManyToManyField。并为您的 MEDIA_CHOICES 创建一个模型。
-
你的意思是? class Media(models.Model): Media_Choices= models.CharField(max_length=30) 类参数 (models.Model): sector= models.ManyToManyField(Media) 表单 .py 如何将小部件设置为复选框?那我可以使用 {{form.sector}} 访问 html 呢?部门必须是复选框!请我是初学者,如果您能提供帮助,我将非常感激
-
没错。如果您在管理员中注册,您可以看到默认小部件。它不是复选框。要带上复选框小部件,您可以像 stackoverflow.com/a/22250192/2282638 这样在元类中定义小部件。在您的表单中,您只需执行 {{ form.sector }} (注意大括号和文本之间的空间。这是一个编码标准)。
-
Sandeep 代码无法使用。类 BacktestForm(forms.ModelForm): market = forms.MultipleChoiceField(label='Market', Choices=Parameters.MARKET, widget=forms.CheckboxSelectMultiple) 部门 = forms.MultipleChoiceField(label='sector', ?????, widget=forms.CheckboxSelectMultiple) 类元:模型 = 参数
-
我应该在这里写什么????如何在 form.py 中建立关系以从媒体获取复选框
标签: django django-forms django-views django-rest-framework