我有一个复选框与多个输入(多个x和y) [英] i have a checkbox with multiple inputs (multiple x and y)

查看:115
本文介绍了我有一个复选框与多个输入(多个x和y)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法将MEDIA_CHOICES保存在数据库中我不知道为什么!市场参数被保存。但是我有对MEDIA_CHOICES作为输入的扇区参数有问题,用户选择输入,但在数据库中保存为空。我找不到问题在哪里。
此处用户需要检查的图片,而不是保存该值,当我访问保存的页面,我发现扇区字段为空未保存

I am unable to save MEDIA_CHOICES in the database I don't know why ! The market parameter is saved. But I have problem with sector parameter that has MEDIA_CHOICES as input, The user choose the inputs but after save it is empty in the database. I cant find where is the problem. 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) 

form.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不可迭代)中:

The error is in HTML (form.sector not iterable):

        <td>{{form.sector.label}}</td>



        <td> {{form.sector}} </td>



  </tr>


推荐答案

如果您的部门为 Charfield 在您有 CheckboxSelectMultiple 窗口小部件的模型和表单中,您可以在html

If you have sector as Charfield in models and in forms you have CheckboxSelectMultiple widget then you can iterate sector field as below in html

{{ form.sector.label }}
{% for f in form.sector %}
                        <li>
                            <div class="checkbox"><label>
                                <input id="{{ f.id_for_label }}" type="checkbox" name="{{ f.name }}"
                                       value="{{ f.choice_value }}" {% if f.choice_value in field.value %}checked{% endif %}><span>{{ f.choice_label }}</span></label>
                            </div>
                        </li>
                    {% endfor %}

如果要在admin中显示复选框,则通过 BacktestForm 作为管理表单。

If you want to show checkbox in admin then pass BacktestForm as admin form.

这篇关于我有一个复选框与多个输入(多个x和y)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆