كيف يمكنني إنشاء نموذج من قائمة النماذج باستخدام WTForms؟

StackOverflow https://stackoverflow.com//questions/24018629

سؤال

لدي قائمة Prediction عارضات ازياء.أريد ربطهم بنموذج والسماح باستخدامه لإعادة النشر.كيف يمكنني تنظيم النموذج الخاص بي بحيث يربط المنشور نتيجة الذهاب/الخارج بـ Prediction عارضات ازياء id حقل لكل عنصر أقوم بربطه بالنموذج؟

منظر

@app.route('/predictor/',methods=['GET','POST'])
@login_required
def predictions():    
    user_id = g.user.id
    prediction= # retrieve prediction
    if request.method == 'POST':
        if form.validate() == False:
            flash('A score is missing, please fill in all predictions')
            render_template('predictor.html', prediction=prediction, form=form)
        else:
            for pred in prediction:
                # store my prediction
            flash('Prediction added')
            return redirect(url_for("predictions"))    
    # display current predictions
    elif request.method == 'GET':
        return render_template('predictor.html', prediction=prediction, form=form)

استمارة

class PredictionForm(WTForm):
    id = fields.IntegerField(validators=[validators.required()], widget=HiddenInput())
    home_score = fields.TextField(validators=[validators.required()])
    away_score = fields.TextField(validators=[validators.required()])

نموذج

  <form action="" method="post">
    {{form.hidden_tag()}}
    <table>
        {% for pred in prediction %}
        <tr>
            <td>{{pred.id}}</td>
            <td>{{form.home_score(size=1)}}</td>
            <td>{{form.away_score(size=1)}}</td>               
        </tr>
        {% endfor %}
    </table>
    <p><input type="submit" value="Submit Predictions"></p>
   </form>

لا أستطيع ربط بياناتي بشكل صحيح POST.تفشل أدوات التحقق المطلوبة باستمرار لأن بيانات النشر تفتقد كافة العناصر مطلوب مجالات.

هل كانت مفيدة؟

المحلول

أنت بحاجة إلى نموذج فرعي يرتبط بالعناصر الموجودة في قائمة التنبؤات:

النموذج الذي وصفته سيسمح لك فقط بإرسال تنبؤ واحد.يبدو أن هناك تناقضًا لأنك تربط عددًا متكررًا من التنبؤات ويبدو أنك تريد توقعًا ذهابًا وإيابًا لكل منها.في الواقع، في الوضع الحالي، لن يتم الرد أبدًا id مجال.سيؤدي هذا دائمًا إلى فشل التحقق من صحة النموذج.أعتقد أن ما تريده هو قائمة النماذج الفرعية.مثل ذلك:

# Flask's form inherits from wtforms.ext.SecureForm by default
# this is the WTForm base form. 
From wtforms import Form as WTForm

# Never render this form publicly because it won't have a csrf_token
class PredictionForm(WTForm):
    id = fields.IntegerField(validators=[validators.required()], widget=HiddenInput())
    home_score = fields.TextField(validators=[validators.required()])
    away_score = fields.TextField(validators=[validators.required()])

class PredictionListForm(Form):
    predictions = FieldList(FormField(PredictionForm))

سيحتاج العرض الخاص بك إلى إرجاع شيء ما على غرار:

predictions = # get your iterable of predictions from the database
from werkzeug.datastructures import MultiDict
data = {'predictions': predictions}
form = PredictionListForm(data=MultiDict(data))

return render_template('predictor.html', form=form)

سيحتاج النموذج الخاص بك إلى التغيير إلى شيء مثل هذا:

<form action='my-action' method='post'>
    {{ form.hidden_tag() }}
    {{ form.predictions() }}
</form>

الآن سيتم طباعة هذا <ul> مع ال <li> لكل عنصر لأن هذا ما يفعله FieldList.سأترك الأمر لك لتصميمه ووضعه في شكل جدول.قد يكون الأمر صعبا بعض الشيء ولكنه ليس مستحيلا.

في POST a، سوف تحصل على قاموس بيانات النموذج مع نتيجة الذهاب والإياب لكل تنبؤ id.يمكنك بعد ذلك ربط هذه التوقعات مرة أخرى بحسابك SQLAlchemy نموذج.

[{'id': 1, 'home': 7, 'away': 2}, {'id': 2, 'home': 3, 'away': 12}]

نصائح أخرى

 {% for key in di_RAA %}
   <tr>
   <td><form id="Run" action="{{ url_for('index') }}" method="post">
        <input type="submit" class="btn" value="TEST" name="RUN_{{key}}"> 
   </form></td>
   </tr>
 {% endfor %}

أنها توفر حلاً بسيطًا آخر لزر متعدد.تعتبر FieldList جيدة، ومن الصعب الحصول على اسم كل زر ووظيفة التشغيل.

from wtforms import fields
from wtforms.fields import FieldList, FormField
from wtforms import validators

بعض النصائح، ربما تضيف بعض الاستيراد وتنظف رسالة خطأ الاستيراد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top